Главная страница
    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.46 MB
Время: 0.01 c
4-1143371475
SergV
2006-03-26 15:11
2006.07.02
Своя панель меню


15-1149325127
grisme
2006-06-03 12:58
2006.07.02
нужен JAVA-скрипт


3-1146683290
Nicky
2006-05-03 23:08
2006.07.02
Ошибка при открытии из первой формы второй


9-1131483653
Кефир87
2005-11-09 00:00
2006.07.02
Текстурные... фейсы?!


11-1129729491
Dmitry Galin
2005-10-19 17:44
2006.07.02
KOL &amp; BDS 2005?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский