Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

Проблема с потоками...   Найти похожие ветки 

 
Boris K.   (2006-06-12 16:32) [0]

Здравствуйте, уважаемые! Подскажите пожалуйста путь решения моей проблемы или подкиньте примерчик плиз... Имеем ListView в стиле vsReport на 10 строк. В каждой строке свой ImageIndex либо 0, либо 1 (активный-неактивный). Создаю 10 потоков одновременно (FreeOnTerminate=true), по завершении работы потоки выполняют синхронизацию типа (MainForm.ListView.ImageIndex :=1 или 0). Потоки работают примерно 5 сек. На это время нужно приостановить выполнение главной процедуры. Короче говоря, нужно дождаться завершения потоков. Как? Не могу заставить работать WaitForMultipleObjects. Пробовал всяко-разно, не могу сообразить... :-( Delphi 10


 
GanibalLector ©   (2006-06-12 17:58) [1]

Типа :

function OneThread(Param:PDWord):DWord;
var I:Integer;
begin
 for I:=1 to  DWord(Param) do
  Sleep(50);
 Windows.Beep(400,30);  // умер
 Result:=0;
end;

function AllThread(Param:Pointer):DWord;
 var I,II:Integer;
     h:THandle;
     ArrayThread:Array [1..10] of THandle;
     Id:DWord;
begin
 for I:=1 to 10 do
 begin
   II:=Random(100);
   h:=BeginThread(nil,0,@OneThread,PDWord(II),0,ID);
   ArrayThread[I]:=h;
 end;
 if WaitForMultipleObjects(10,@ArrayThread,True,Infinite)=WAIT_OBJECT_0 then
   Windows.Beep(800,300); // все померли !
 Result:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
 var ThId:DWord;
begin
 Randomize;
 CloseHandle(BeginThread(nil,0,@AllThread,nil,0,ThId));
end;


З.Ы. Возможны неточности ;)


 
Boris K.   (2006-06-12 18:41) [2]

Я может чего не так совсем пишу... Вот на чем остановился:
Watch.pas-отдельный юнит, в нем реализован поток.

var ThrdWatch:TThread;
.....
procedure TMainForm.TimerTimer(Sender: TObject);
var I:WORD;
hThrd: array of integer;// пробовал тут и с array of PWOHandleArray :-(
begin
 SetLength(hThrd, ListView.Items.Count);
 for I:=0 to ListView.Items.Count -1 do
    begin
       ThrdWatch := TWatch.Create(I,ListView.Items.Item[I].Caption);// передаю в поток индекс и заголовок, там это обрабатывается (ListView.Items.Item[I].ImageIndex :=1 или 0)
       hThrd[I]:= ThrdWatch.Handle; // <- ???
   end;
 WaitForMultipleObjects(ListView.Items.Count,@hThrd,true,Infinite);//тут хочу дождаться завершения потоков ~2-5 сек.
 Statusbar.Panels[1].Text := SysErrorMessage(GetLastError);
end;

Далее идут функции обработки (Images 1 или 0) в ListView...

Где я тут накосячил? GetLastError говорит, то "неверный дескриптор", то всё ОК, но ничего не работает. Перелопатил за 4 дня такую кучу вариаций кода!!! Как правильней написать в данном случае?



Страницы: 1 вся ветка

Текущий архив: 2006.07.02;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.036 c
2-1149954352
Fiallo4ka
2006-06-10 19:45
2006.07.02
заполнение таблиц в базе


5-1134742514
De
2005-12-16 17:15
2006.07.02
Хочу таскать панели, но как?


1-1148317839
Juice
2006-05-22 21:10
2006.07.02
Drag&amp;Dock и позиция дочерних элементов


2-1149847180
VitV
2006-06-09 13:59
2006.07.02
Хранения данных в из DBRichedit.


1-1147985639
allrussia
2006-05-19 00:53
2006.07.02
Спецам по Excel: Размер примечания