Working in the background

12 отговора 475 прегледа
#1

Working in the background

Искам програмата ми да работи в background, и да речем през 10 минути да проверява в една определена директрория дали има файлове в нея (и ако има ги обработва по специален начин, след това ги премества другаде-това е лесно). Та въпросът ми е как да я направя така, че да проверява през N минути дали в директория c:\input са пристигнали някакви файлове
И ако може да не е със sleep процедурата :)

Благодаря

Редактирано от legato на

Отговор
в отговор на legato #2

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.

Отговор
в отговор на mf2hd #3

Re: Working in the background

Функцията е


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, но той най-често го прави !!!
Отговор
в отговор на Пaпaraлa Йoprи #4

Re: Working in the background

Именно

Тези дни се наложи да я напиша и на C++

---
...и аз пиша на кирилица!

Редактирано от ess на

Отговор
в отговор на ess #5

Re: Working in the background

Е поне си имал опит от предишното й писане на Delphi

Не всичко което виси е Windows, но той най-често го прави !!!
Отговор
в отговор на Пaпaraлa Йoprи #7

Заспива ...

Това е процедурата, с която искам да правя 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;

Отговор
в отговор на legato #8

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;

---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на PhantomAS #9

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);

и т.н.

Отговор
в отговор на andrew_nikoloff #10

Re: Заспива ...

Ама човека не е стигнал още до отделяне на кода в друга нишка - просто е вързал това на някакъв onClick ;-))) забивало е заради цикъла в който го е вкарал - нямало е кой да процесва съобщенията на приложението ;-)) - най малкото може да сложи едно Application.ProcessMessages в цикъла.

---
Е т'ва е живот!
Отговор
в отговор на andrew_nikoloff #11

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, но го изпробвах и като не е член, а си е отделна функция - но пак същото ...

Отговор
в отговор на PhantomAS #12

Re: Заспива ...

Да, искам нещо супер просто, но май задълбах на другаде ...


ProcessMessages ми върши идеална работа,

Благодаря много

Редактирано от legato на

Отговор
в отговор на PhantomAS #13

Re: Заспива ...

Нещо спя май... За нишки си говорим, а аз блея

Отговор