Ĺadny brzuch
Witam Serdecznie,
Mam następujący problem. Chciałbym aby wątek był uruchamiany za wątkiem (kolejkowanie zadań)
MainForm
interface uses ... ,Thread; ... var Thr: TAnalyse; implementation {wywołanie} Thr := TAnalyse.Create(ListBox1, 111); Thr := TAnalyse.Create(ListBox1, 222); ...
Thread.pas
type TAnalyse = class(TThread) private { Private declarations } Listbox: TListBox; Number: Integer; private procedure UpdateProgress; protected procedure Execute; override; public constructor Create(ListB: TListBox; Liczba: Integer); destructor Destroy; override; end; implementation { TAnalyse } constructor TAnalyse.Create(ListB: TListBox; Liczba: Integer); begin Listbox := ListB; Number := Liczba; FreeOnTerminate := True; inherited Create(False); end; destructor TAnalyse.Destroy; begin inherited; end; procedure TAnalyse.Execute; var I: Integer; begin for I := 0 to 100 do begin if Terminated then Exit; Listbox.Items.Add(IntToStr(Number)); Sleep(250); end; Synchronize(UpdateProgress); end; procedure TAnalyse.UpdateProgress; begin Application.ProcessMessages; Listbox.Repaint; end;
I na liście powinno pojawić się 100 razy '111' i 100 razy '222'
a nie jak jest teraz czyli
111
222
111
111
222
111
222
...
Jak można rozwiązać ten problem?
Proszę o Pomoc :)
Użytkownik Qenix edytował ten post 14 luty 2010, 21:03
Możesz zrobić tak, że pierwszy wątek będzie po wykonaniu swoich instrukcji tworzyć ten drugi wątek, ewentualnie ten drugi jest tworzony jako uśpiony i ten pierwszy go wznawia. Btw, skoro te operacje nie mają być wykonane jednocześnie, to nie może wszystkiego zrobić jeden wątek?
Użytkownik Narwany Operator Kombajnu edytował ten post 14 luty 2010, 21:52
Btw, skoro te operacje nie mają być wykonane jednocześnie, to nie może wszystkiego zrobić jeden wątek?
W/w przykład przeze mnie jest tylko prostym przykładem. Chodzi o to że będę dostawał jakiś dynamiczny parametr i jeżeli już istnieje uruchomiony wątek to czeka aż on skończy. (Kolejkowanie Wątków)
http://code.google.c...ithreadlibrary/
Nie bardzo chciałbym używać komponentu ;(
Wczoraj znalazłem taki kod:
program Project1; {$APPTYPE CONSOLE} uses Windows; var // Semaphore, to keep the limit. Semaphore: THandle; // Critical section so threads don't disturb each other. Section: TRTLCriticalSection; function SomeThread(Parameter: Pointer): Integer; var I, e: Integer; begin // Thread function must return result. Result := 0; // Wait for the semaphore, which limits us to 10 threads. if (WaitForSingleObject(Semaphore, INFINITE) = WAIT_OBJECT_0) then begin try for I := 1 to 5 do begin EnterCriticalSection(Section); try //Zatrzymaj się czasami e := Random(2); if e = 0 then Sleep(200); WriteLn('Thread ', Integer(Parameter), ': ', I:2); finally LeaveCriticalSection(Section); end; end; EnterCriticalSection(Section); try WriteLn('Thread ', Integer(Parameter), ' done'); finally LeaveCriticalSection(Section); end; finally ReleaseSemaphore(Semaphore, 1, nil); end; end; end; const InitialCount = 1; MaximumCount = 10; var Threads: array [1 .. 3] of THandle; ThreadID: Cardinal; I: Integer; begin // Semaphore for the limit of MaximumCount threads. Semaphore := CreateSemaphore(nil, InitialCount, MaximumCount, nil); // Critical section for thread-0safe access to console. InitializeCriticalSection(Section); // Just starting 50 threads. for I := Length(Threads) downto 1 do begin Threads[I] := BeginThread(nil, 0, SomeThread, Pointer(I), 0, ThreadID); // Let the thread do some actions now. end; // Now wait for all threads to finish. WaitForMultipleObjects(Length(Threads), @Threads, True, INFINITE); // End of critical section. DeleteCriticalSection(Section); // Close the semaphore. CloseHandle(Semaphore); // All done. WriteLn('All done.'); Readln; end.
I dzisiaj cały dzień się z nim bawiłem ;) Ale kompletnie nic mi nie wychodzi. Macie jakiś pomysł jak można by to przypasować do klasy TThread ?
Użytkownik Qenix edytował ten post 15 luty 2010, 13:47
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Mam następujący problem. Chciałbym aby wątek był uruchamiany za wątkiem (kolejkowanie zadań)
MainForm
interface uses ... ,Thread; ... var Thr: TAnalyse; implementation {wywołanie} Thr := TAnalyse.Create(ListBox1, 111); Thr := TAnalyse.Create(ListBox1, 222); ...
Thread.pas
type TAnalyse = class(TThread) private { Private declarations } Listbox: TListBox; Number: Integer; private procedure UpdateProgress; protected procedure Execute; override; public constructor Create(ListB: TListBox; Liczba: Integer); destructor Destroy; override; end; implementation { TAnalyse } constructor TAnalyse.Create(ListB: TListBox; Liczba: Integer); begin Listbox := ListB; Number := Liczba; FreeOnTerminate := True; inherited Create(False); end; destructor TAnalyse.Destroy; begin inherited; end; procedure TAnalyse.Execute; var I: Integer; begin for I := 0 to 100 do begin if Terminated then Exit; Listbox.Items.Add(IntToStr(Number)); Sleep(250); end; Synchronize(UpdateProgress); end; procedure TAnalyse.UpdateProgress; begin Application.ProcessMessages; Listbox.Repaint; end;
I na liście powinno pojawić się 100 razy '111' i 100 razy '222'
a nie jak jest teraz czyli
111
222
111
111
222
111
222
...
Jak można rozwiązać ten problem?
Proszę o Pomoc :)
Użytkownik Qenix edytował ten post 14 luty 2010, 21:03
Możesz zrobić tak, że pierwszy wątek będzie po wykonaniu swoich instrukcji tworzyć ten drugi wątek, ewentualnie ten drugi jest tworzony jako uśpiony i ten pierwszy go wznawia. Btw, skoro te operacje nie mają być wykonane jednocześnie, to nie może wszystkiego zrobić jeden wątek?
Użytkownik Narwany Operator Kombajnu edytował ten post 14 luty 2010, 21:52
Btw, skoro te operacje nie mają być wykonane jednocześnie, to nie może wszystkiego zrobić jeden wątek?
W/w przykład przeze mnie jest tylko prostym przykładem. Chodzi o to że będę dostawał jakiś dynamiczny parametr i jeżeli już istnieje uruchomiony wątek to czeka aż on skończy. (Kolejkowanie Wątków)
http://code.google.c...ithreadlibrary/
Nie bardzo chciałbym używać komponentu ;(
Wczoraj znalazłem taki kod:
program Project1; {$APPTYPE CONSOLE} uses Windows; var // Semaphore, to keep the limit. Semaphore: THandle; // Critical section so threads don't disturb each other. Section: TRTLCriticalSection; function SomeThread(Parameter: Pointer): Integer; var I, e: Integer; begin // Thread function must return result. Result := 0; // Wait for the semaphore, which limits us to 10 threads. if (WaitForSingleObject(Semaphore, INFINITE) = WAIT_OBJECT_0) then begin try for I := 1 to 5 do begin EnterCriticalSection(Section); try //Zatrzymaj się czasami e := Random(2); if e = 0 then Sleep(200); WriteLn('Thread ', Integer(Parameter), ': ', I:2); finally LeaveCriticalSection(Section); end; end; EnterCriticalSection(Section); try WriteLn('Thread ', Integer(Parameter), ' done'); finally LeaveCriticalSection(Section); end; finally ReleaseSemaphore(Semaphore, 1, nil); end; end; end; const InitialCount = 1; MaximumCount = 10; var Threads: array [1 .. 3] of THandle; ThreadID: Cardinal; I: Integer; begin // Semaphore for the limit of MaximumCount threads. Semaphore := CreateSemaphore(nil, InitialCount, MaximumCount, nil); // Critical section for thread-0safe access to console. InitializeCriticalSection(Section); // Just starting 50 threads. for I := Length(Threads) downto 1 do begin Threads[I] := BeginThread(nil, 0, SomeThread, Pointer(I), 0, ThreadID); // Let the thread do some actions now. end; // Now wait for all threads to finish. WaitForMultipleObjects(Length(Threads), @Threads, True, INFINITE); // End of critical section. DeleteCriticalSection(Section); // Close the semaphore. CloseHandle(Semaphore); // All done. WriteLn('All done.'); Readln; end.
I dzisiaj cały dzień się z nim bawiłem ;) Ale kompletnie nic mi nie wychodzi. Macie jakiś pomysł jak można by to przypasować do klasy TThread ?
Użytkownik Qenix edytował ten post 15 luty 2010, 13:47