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

Вниз

Проблема 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
3-93764
Lisa
2004-02-04 13:59
2004.02.29
Номер выделенной строки в DBGrid e


14-94182
Кен
2004-02-05 04:06
2004.02.29
LindowsOS можно скачать бесплатно через Р2Р-сети


3-93813
Крутыш
2004-02-03 00:18
2004.02.29
Проблемы с датами в запросе Update


1-94001
REA
2004-02-16 17:14
2004.02.29
DrawText


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





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