![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Периодический опрос во время работы программы. [D7, WinXP]
kyn66 © (2009-11-02 11:48:00)Во время работы программы необходимо периодически делать опрос какого либо типа (к примеру наличие файла в некотором каталоге). Если бы программа состояла из одной формы - то понятно было бы, повесил на таймерное событие и все. Но тут в разные моменты времени могут открываться разные модальные формы. Т.е. получается, что вместе с работой программы должен работать некий дополнительный резидент, я так себе это представляю. Или есть другое решение?
Юрий Зотов (2009-11-02 23:16:00) [21]> kyn66 © (02.11.09 22:55) [12]
> Честно говоря не совсем понятно о чем идет речь
Вы поймете это, как только ознакомитесь в MSDN с описанием функций Find...ChangeNotification и WaitForSingleObject.
В переводе на русский язык это звучит примерно так:
Подписаться на уведомление о первом изменении файла;
Пока поток не прерван, do
begin
Ждать уведомления об изменении файла;
... // Получив это уведомление, что-то сделать
Подписаться на уведомление о следующем изменении файла;
end;
Освободить захваченные ресурсы;
kyn66 (2009-11-02 22:55:00) [22]Честно говоря не совсем понятно о чем идет речь, т.к. никогда не приходилось сталкиваться с такими вещами. Однако век живи - век учись... В моем понятии применение потоков, даже можно подрядить несколько потоков на каждый проверяемый каталог, дает ничто иное, как параллельное выполнение независимых операций. Только вот смысл затеи в том, чтобы запрограммировать эти действия(однократный запрос) через определенный промежуток времени, установленный в параметрах программы. Как это к примеру делается в TheBat - проверка почты через определенный интервал времени.
Юрий Зотов (2009-11-02 22:43:00) [23]Или проще - вместо INFINITE ставить некоторый TimeOut. Выход из цикла и завершение потока произойдут по Terminated.
Leonid Troyanovsky (2009-11-02 22:00:00) [24]
> Дмитрий Белькевич (02.11.09 19:07) [9]
> >WaitForSingleObject(H, INFINITE);
> Тред не повиснет??? Думается, что нужно механизмы выхода
> из бесконечного ожидания продумывать.
Все уже придумано до нас.
WaitForSingleObjectEx & QueueUserAPC.
--
Regards, LVT.
Дмитрий Белькевич (2009-11-02 19:07:00) [25]>WaitForSingleObject(H, INFINITE);
Тред не повиснет??? Думается, что нужно механизмы выхода из бесконечного ожидания продумывать. Например, делать дополнительный event и WaitForMultipleObject.
clickmaker (2009-11-02 18:07:00) [26]> а не постоянно опрашивать.?
H := FindFirstChangeNotification
while not Terminated do
begin
WaitForSingleObject(H, INFINITE);
...
FindNextChangeNotification(H);
end;
FindCloseChangeNotification(H);
kyn66 (2009-11-02 17:19:00) [27]Нашел способ как это сделать с помощью потоков. Однако, не совсем понятно, а как потоку сказать выполнить опрос через указанный промежуток времени, а не постоянно опрашивать.?
kyn66 (2009-11-02 12:02:00) [28]
> ОС предоставляет механизмы асинхронной польз.нотификации
> об изменениях в интересующих объектах файловой системы.
Да, знаю про такое. Действительно его можно и применить. Спасибо.
brother (2009-11-02 12:00:00) [29]> Т.е. повесить таймер на Main-форму и этого будет достаточно?
если [4] для тебя сложно - то да)
Сергей М. (2009-11-02 11:59:00) [30]
> периодически делать опрос ...наличие
> файла в некотором каталоге
Дурная затея.
ОС предоставляет механизмы асинхронной польз.нотификации об изменениях в интересующих объектах файловой системы.
kyn66 (2009-11-02 11:56:00) [31]
> brother © (02.11.09 11:51) [2]
> > Или есть другое решение?таймер висит на первой созданной
> форме...
Т.е. повесить таймер на Main-форму и этого будет достаточно?
CrytoGen (2009-11-02 11:51:00) [32]таймеры нормально работают, когда открываются модальный окна
brother (2009-11-02 11:51:00) [33]> Или есть другое решение?
таймер висит на первой созданной форме...