Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 12:15   #1
[MoNAMur]
читер
Форумчанин
 
Аватар для [MoNAMur]
 
Регистрация: 05.10.2009
Сообщений: 150
Вопрос Потоки: цикличность выполнения

почему someproc выполняется только один раз, в то время как detectChanges отрабатывает как надо несколько раз.
detectChanges - отслеживает изменения в папке(создание, удаление файлов)

Код:
procedure TMNTThread.Execute;
begin
     while not Terminated do
      begin
           Synchronize(someproc);
           Synchronize(detectChanges);
      end;
end;

...

procedure TMNTThread.someproc;
begin
     showmessage('someproc running');
end;
$me = $me == $me ? $me : $me;
[MoNAMur] вне форума Ответить с цитированием
Старый 11.11.2011, 12:32   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
showmessage('someproc running');
ОСТАНАВЛИВАЕТ работу процедуры ДО реакции пользователя.
т.е. выход из
Код:
procedure TMNTThread.someproc;
НЕ РАНЬШЕ чем пользователь зароет окно сообщения.

Код:
Synchronize(someproc);
ОСТАНАВЛИВАЕТ работу потока ДО окончания работы указанной процедуры.
тоже относится и к
Код:
Synchronize(detectChanges);
Т.е. поток ОСТАНОВЛЕН и ждет когда пользователь закроет окно. После закрытия окна сообщения поток продолжит работу.
А поскольку работы никакой то сразу видим новое окно сообщения (но точная копия старого).

P.S. На форуме было много тем как надо и как не надо использовать Synchronize в потоках.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.11.2011 в 12:36.
evg_m вне форума Ответить с цитированием
Старый 11.11.2011, 12:38   #3
[MoNAMur]
читер
Форумчанин
 
Аватар для [MoNAMur]
 
Регистрация: 05.10.2009
Сообщений: 150
По умолчанию

если закоментить метод detectChanges То работает нормально

Код:
procedure TMNTThread.detectChanges;
var
    Notify: TFileNotifyInformation;
    BytesReturned: DWORD;
    FileName : PWideChar;
begin
    if DirectoryMonitoring <> INVALID_HANDLE_VALUE then
          if not ReadDirectoryChangesW(DirectoryMonitoring,
                                      @Notify,
                                      SizeOf(TFileNotifyInformation),
                                      False,
                                      FilterNotify,
                                      @BytesReturned,
                                      nil,
                                      nil) then  raise Exception.Create(SysErrorMessage(GetLastError))
          else
             begin
                  GetMem(FileName,Notify.FileNameLength+2);
		  ZeroMemory(FileName,Notify.FileNameLength+2);
		  lstrcpynW(FileName,Notify.FileName, Notify.FileNameLength div 2+1);
                  case Notify.Action of
                      FILE_ACTION_ADDED: addFileToListing(FileName);
                      FILE_ACTION_REMOVED: deleteFileFromListing(FileName);
                     end;
             end;
end;
Что в этом методе может останавливать работу? методы addFileToListing, deleteFileFromListing - добавление и удаления записи в динамический список? сама функция ReadDirectoryChangesW останавливает? вроде в документации нет такого, да и в примерах об этом не говорилось...
$me = $me == $me ? $me : $me;

Последний раз редактировалось [MoNAMur]; 11.11.2011 в 13:03.
[MoNAMur] вне форума Ответить с цитированием
Старый 11.11.2011, 13:42   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
почему someproc выполняется только один раз, в то время как detectChanges отрабатывает как надо несколько раз.
Цитата:
если закоментить метод detectChanges То работает нормально
Какому из постов верить?

Цитата:
Что в этом методе может останавливать работу?
Сам факт Synchonize ОСТАНАВЛИВАЕТ работу потока ДО окончания работы указанной в его параметрах процедуры. Нет там тормозов хорошо.Выполнилась указанная процедура, И только потом ПОТОК ПОШЕЛ дальше.
Если в потоке только Synchonise то налицо бесполезность оного. ( и даже вредность переключения потоков имеет накладные расходы).

Наглядная иллюстрация
Для потока это два человека, каждый из которых может заниматься своим делам.
Synhronuse это когда второй человек
ПРОСИТ первого человека сделать что конкретное (someproc, detectChanges)
И ЖДЕТ пока тот это сделает.

В твоей программе второй человек только и делает что просит первого сделать то-то и то-то.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.11.2011 в 14:02.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки в с# qwerty74 C# (си шарп) 5 22.06.2011 13:57
Потоки Killer_Pooh Общие вопросы Delphi 4 01.06.2011 02:28
[C#] Потоки Lemo C# (си шарп) 2 24.05.2011 21:50
Потоки _-Re@l-_ Общие вопросы Delphi 6 18.01.2011 20:45