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

Вниз

Проблема WaitForSingleObject в отдельном потоке   Найти похожие ветки 

 
Вован_   (2004-02-16 15:41) [0]

Уважаемые мастера! В моей проге в отдельном потоке надо запускать внешнее приложение и ждать, когда оно закончит свою работу. Для этого я использовал следующий код, который выполняется в паралельном потоке:

var
si: TStartupInfo;
p: TProcessInformation;
begin
if <условие> then begin
FillChar(si,SizeOf(si),0);
with si do begin
cb:=SizeOf(si);
dwFlags:=startf_UseShowWindow;
wShowWindow:=SW_MAXIMIZE;
end;
CreateProcess(nil,PChar(Edit1.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);
WaitForSingleObject(p.hProcess,Infinite);
end else <выполняется что-то другое>;
end;

Так вот, когда "выполняется что-то другое", паралельный поток работает нормально и в это же время можно делать что-либо в основном потоке. А когда требуется подождать завершения выполения внешнего приложения - зависает вся прога, т.е. и основной поток приложения.

В чем тут дело? Как избавиться от зависания основного потока приложения?


 
MBo ©   (2004-02-16 16:09) [1]

> зависает вся прога, т.е. и основной поток приложения.
Значит, у тебя неверно построена синхронизация


 
Семен Сорокин ©   (2004-02-16 16:10) [2]

Вован_ (16.02.04 15:41)
покажи как ты этот кусок в потоке используешь.
меня смущает вот это:
CreateProcess(nil,PChar( Edit1.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);


 
Digitman ©   (2004-02-16 16:19) [3]


> зависает вся прога


и как это выглядит ? визуально ?


 
Вован_   (2004-02-16 16:19) [4]

В основном потоке выполняется команда:

Thread1.DoWork;

Поток Thread1 в юните UTA сделал следующим образом:

unit UTA;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
MyThread = class(TThread)
private
{private declarations}
protected
procedure Execute; override;
public
procedure DoWork;
end;

var
Thread1: MyThread;

implementation

uses UMainForm;

procedure MyThread.Execute;
begin
if not Terminated then Synchronize(DoWork);
end;

procedure MyThread.DoWork;
var
si: TStartupInfo;
p: TProcessInformation;
begin
FillChar(si,SizeOf(si),0);
with si do begin
cb:=SizeOf(si);
dwFlags:=startf_UseShowWindow;
wShowWindow:=SW_MAXIMIZE;
end;
CreateProcess(nil,PChar(MainForm.Edit2.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);
WaitForSingleObject(p.hProcess,Infinite);
end;

end.

Да, название внешнего приложения для процедуры CreateProcess берется из другой формы - MainForm, но это же не повод всё приложение вешать:)


 
Вован_   (2004-02-16 16:24) [5]

2 Digitman

Визуально это выглядит следующим образом. Главная форма приложения в рантайме дает возможность динамически настраивать некоторые характеристики приложения, которое должно себе время от времени выполняться в параллельном потоке, чтобы не мешать юзеру делать на главной форме в это же время что-то другое.

Так вот, когда внешнее приложение в Thread1 выполняется, на внешней форме ничего сделать нельзя - прога как-бы зависает до окончания работы Thread1.


 
Guest   (2004-02-16 16:24) [6]

Synchronize(DoWork) означает, что DoWork выполняется в контексте главного потока. Поэтому именно он ждет и "виснет"


 
Вован_   (2004-02-16 16:28) [7]

Guest (16.02.04 16:24) [6]

Если просто сделать if not Terminated then DoWork;
тогда то же самое :(


 
Guest   (2004-02-16 16:32) [8]

[7] Вован_ (16.02.04 16:28)

Пробовали или так думаете? :)
В основном потоке нет какой-либо синхронизации?


 
Семен Сорокин ©   (2004-02-16 16:33) [9]

2Вован_
передавай MainForm.Edit2.Text в качестве параметра своему потоку, и обработку веди в теле процедуры Execute без Synhronize и все у тебя получится.


 
Digitman ©   (2004-02-16 17:13) [10]

Вован, ты сдув один-в-один из статьи Кариха вот это

procedure MyThread.Execute;
begin
if not Terminated then Synchronize(DoWork);
end;

думал ли хоть чуть-чуть, что. почему и зачем здесь происходит ?


 
Бином Ньютоныч   (2004-02-16 18:37) [11]

>В основном потоке выполняется команда:

>Thread1.DoWork;

Это круто



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

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

Наверх




Память: 0.49 MB
Время: 0.018 c
1-93952
blackmach
2004-02-17 17:00
2004.02.29
Кнопки на таскбаре для каждой формы


4-94246
brn
2003-12-21 16:08
2004.02.29
Задания(Job Object)


3-93787
Санек
2004-02-03 18:43
2004.02.29
Как создать вычисляемое поле в рантайме ?


1-93861
Maxio
2004-02-16 16:33
2004.02.29
После точки


14-94104
SkyRanger
2004-02-10 09:40
2004.02.29
Добро и Зло в Вашем понимании...