Форум: "Начинающим";
Текущий архив: 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