Главная страница
    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.01 c
2-1149862589
Serzh
2006-06-09 18:16
2006.07.02
Keys


1-1148387421
novill
2006-05-23 16:30
2006.07.02
Как описание класса разбить на несколько модулей?


4-1143701094
V.exeR
2006-03-30 10:44
2006.07.02
В IE надо перехватывать добавление страницы в "избранное"...


5-1134898951
Vaitek_
2005-12-18 12:42
2006.07.02
Хранение ресурса "внутри" компонента.


1-1148413914
Панченко Владимир ака ПАН
2006-05-23 23:51
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский