Working in the background
12 отговора
475 прегледа
Working in the background
Искам програмата ми да работи в background, и да речем през 10 минути да проверява в една определена директрория дали има файлове в нея (и ако има ги обработва по специален начин, след това ги премества другаде-това е лесно). Та въпросът ми е как да я направя така, че да проверява през N минути дали в директория c:\input са пристигнали някакви файлове
И ако може да не е със sleep процедурата :)
Благодаря
И ако може да не е със sleep процедурата :)
Благодаря
Редактирано от legato на
Re: Working in the background
Ami lesniq na4in e TTimer.
Ima i malko po-truden - Windows-a si ima metodi za sledena na directorii, potarsi v helpa. V momenta ne se se6tam za imeto, sorry.
Ima i malko po-truden - Windows-a si ima metodi za sledena na directorii, potarsi v helpa. V momenta ne se se6tam za imeto, sorry.
Re: Working in the background
Функцията е
Не всичко което виси е Windows, но той най-често го прави !!!
BOOL ReadDirectoryChangesW(
HANDLE hDirectory, // handle to the directory to be watched
LPVOID lpBuffer, // pointer to the buffer to receive the read results
DWORD nBufferLength, // length of lpBuffer
BOOL bWatchSubtree, // flag for monitoring directory or directory tree
DWORD dwNotifyFilter, // filter conditions to watch for
LPDWORD lpBytesReturned, // number of bytes returned
LPOVERLAPPED lpOverlapped, // pointer to structure needed for overlapped I/O
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // pointer to completion routine
);
Не всичко което виси е Windows, но той най-често го прави !!!
Re: Working in the background
Именно
Тези дни се наложи да я напиша и на C++
---
...и аз пиша на кирилица!
Тези дни се наложи да я напиша и на C++
---
...и аз пиша на кирилица!
Редактирано от ess на
Re: Working in the background
Е поне си имал опит от предишното й писане на Delphi 

Не всичко което виси е Windows, но той най-често го прави !!!
Не всичко което виси е Windows, но той най-често го прави !!!
Заспива ...
Това е процедурата, с която искам да правя monitoring на директорията. Пускам програмата, натискам Button1 и тя би трябвало да започне да наблюдава тази директория - копирам някакъв произволен файл в нея, но тя така е увиснала, че не може да се види дали го е засякла - дали е добавила нещо в ListBox1:
procedure TForm1.Button1Click(Sender: TObject);
var dwWaitStatus : DWORD ;
var dwChangeHandles : HWND;
begin
dwChangeHandles := FindFirstChangeNotification(
'c:\watched', // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
if (dwChangeHandles = INVALID_HANDLE_VALUE) then
Listbox1.Items.Add('error INVALID_HANDLE_VALUE') ;
while true do
begin
dwWaitStatus := WaitForSingleObject(dwChangeHandles, INFINITE) ;
if dwWaitStatus = WAIT_OBJECT_0 then
begin
ListBox1.Items.Add('OK - SOMETHING HAPPENED') ;
if ( FindNextChangeNotification(dwChangeHandles) = FALSE ) then
ExitProcess(GetLastError());
end ;
end ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var dwWaitStatus : DWORD ;
var dwChangeHandles : HWND;
begin
dwChangeHandles := FindFirstChangeNotification(
'c:\watched', // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
if (dwChangeHandles = INVALID_HANDLE_VALUE) then
Listbox1.Items.Add('error INVALID_HANDLE_VALUE') ;
while true do
begin
dwWaitStatus := WaitForSingleObject(dwChangeHandles, INFINITE) ;
if dwWaitStatus = WAIT_OBJECT_0 then
begin
ListBox1.Items.Add('OK - SOMETHING HAPPENED') ;
if ( FindNextChangeNotification(dwChangeHandles) = FALSE ) then
ExitProcess(GetLastError());
end ;
end ;
end;
Re: Заспива ...
Ами как няма да заспи ;-))))
Махни онова INFINITE и сложи 500. Целия код го прехвърли в нишка - в един безкраен цикъл (е разбира се сложи накакъв флаг за да можеш да спреш някога процеса де.
Ако искаш дай майл и ще ти пратя готов компонент.
ChangeHandle:= FINDFIRSTCHANGENOTIFICATION(PChar(WatchPath), false,
hNotifyFilter);
if ChangeHandle <> INVALID_HANDLE_VALUE then
while ****Флаг***** do
begin
if WaitForSingleObject(ChangeHandle,500) = WAIT_OBJECT_0 then
begin
// правиш нещо тук
end;
FindNextChangeNotification(ChangeHandle);
end;
---
Е т'ва е живот!
Махни онова INFINITE и сложи 500. Целия код го прехвърли в нишка - в един безкраен цикъл (е разбира се сложи накакъв флаг за да можеш да спреш някога процеса де.
Ако искаш дай майл и ще ти пратя готов компонент.
ChangeHandle:= FINDFIRSTCHANGENOTIFICATION(PChar(WatchPath), false,
hNotifyFilter);
if ChangeHandle <> INVALID_HANDLE_VALUE then
while ****Флаг***** do
begin
if WaitForSingleObject(ChangeHandle,500) = WAIT_OBJECT_0 then
begin
// правиш нещо тук
end;
FindNextChangeNotification(ChangeHandle);
end;
---
Е т'ва е живот!
Редактирано от PhantomAS на
Re: Заспива ...
Това едно на ръка. Освен това трябва всякакви работи от сорта на Listbox1.Items.Add да се викат от Syncronize... Например правиш си процедурки:
procedure AddError;
begin
Listbox1.Items.Add('error INVALID_HANDLE_VALUE') ;
end;
и
procedure AddOK;
begin
Listbox1.Items.Add('OK - SOMETHING HAPPENED') ;
end;
и вместо да бъркаш директно в треда на VCL-а пишеш така:
Syncronize(AddError);
и т.н.
procedure AddError;
begin
Listbox1.Items.Add('error INVALID_HANDLE_VALUE') ;
end;
и
procedure AddOK;
begin
Listbox1.Items.Add('OK - SOMETHING HAPPENED') ;
end;
и вместо да бъркаш директно в треда на VCL-а пишеш така:
Syncronize(AddError);
и т.н.
Re: Заспива ...
Ама човека не е стигнал още до отделяне на кода в друга нишка - просто е вързал това на някакъв onClick ;-))) забивало е заради цикъла в който го е вкарал - нямало е кой да процесва съобщенията на приложението ;-)) - най малкото може да сложи едно Application.ProcessMessages в цикъла.
---
Е т'ва е живот!
---
Е т'ва е живот!
Re: Заспива ...
тук май трябва да си направя и клас, който наследява TThread и да му добавя функциите AddOK i AddError нали ?
Защото ако го направя така, както ти си ми го написал и си викна някъде в
TForm1.Button1Click функцията Synchronize(AddOK) и ми дава следната грешка: Statement expected, but expression of type integer found
toest:
procedure TForm1.Button1Click(Sender: TObject);
var dwWaitStatus : DWORD ;
var dwChangeHandle : HWND;
var i : integer ;
begin
dwChangeHandle := FindFirstChangeNotification(
PChar('c:\watched'), // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
i := 0 ;
while i < 5 do
begin
dwWaitStatus := WaitForSingleObject(dwChangeHandle, 500) ;
if dwWaitStatus = WAIT_OBJECT_0 then
begin
Synchronize(AddError) ;
Inc(i) ;
end ;
FindNextChangeNotification(dwChangeHandle) ;
end ;
end;
като тук AddError е член на класа TForm1, но го изпробвах и като не е член, а си е отделна функция - но пак същото ...
Защото ако го направя така, както ти си ми го написал и си викна някъде в
TForm1.Button1Click функцията Synchronize(AddOK) и ми дава следната грешка: Statement expected, but expression of type integer found
toest:
procedure TForm1.Button1Click(Sender: TObject);
var dwWaitStatus : DWORD ;
var dwChangeHandle : HWND;
var i : integer ;
begin
dwChangeHandle := FindFirstChangeNotification(
PChar('c:\watched'), // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
i := 0 ;
while i < 5 do
begin
dwWaitStatus := WaitForSingleObject(dwChangeHandle, 500) ;
if dwWaitStatus = WAIT_OBJECT_0 then
begin
Synchronize(AddError) ;
Inc(i) ;
end ;
FindNextChangeNotification(dwChangeHandle) ;
end ;
end;
като тук AddError е член на класа TForm1, но го изпробвах и като не е член, а си е отделна функция - но пак същото ...
Re: Заспива ...
Да, искам нещо супер просто, но май задълбах на другаде ...
ProcessMessages ми върши идеална работа,
Благодаря много
ProcessMessages ми върши идеална работа,
Благодаря много
Редактирано от legato на