Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.009 c
2-1150294685
Megabyte
2006-06-14 18:18
2006.07.02
Как "урезать" лишние знаки после запятой у чисел типа real?


2-1150394396
Тимофей Юрьевич
2006-06-15 21:59
2006.07.02
не заню как и назвать;)


2-1149764652
Megabyte
2006-06-08 15:04
2006.07.02
Программное создание пользователя в MSSQL


15-1149688732
Некий житель, Ваш сосед
2006-06-07 17:58
2006.07.02
Школьная программа...


2-1150362531
[BAD]Angel
2006-06-15 13:08
2006.07.02
как подавить сообщение об ошибке?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский