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

Вниз

форма и thread   Найти похожие ветки 

 
PVOID   (2004-02-05 13:23) [0]

помогите плз мастаки советом.
возник такой трабл. Есть thread который в своем Execute создает форму и в определенный момент времени делает ей show. Кроме того в thread естественно присутсвует Sleep.
Как только thread делает форме show, все окна в приложении, включая и вновь появившееся моментами подвисают. Чувствую я что в этом виноват присловутый Sleep, но как он влияет и как этого избежать не понимаю.


 
TUser ©   (2004-02-05 13:24) [1]

Код есть?


 
Никто   (2004-02-05 13:30) [2]

VCL не поддерживает многопоточность.
Необходимо использовать Synchronize().


 
PVOID   (2004-02-05 13:33) [3]

код большой если сократить, то выглядит это так:

Procedure tMyThread.Execute;
var f:tMyForm;
begin
f:=tMyForm.Create(Application)
while not terminated do
begin
// Здесь работаем, при этом, совем забыл вызываем функцию из сторонней dll
if(то-то то-то)then f.Show;
Sleep(1000);
end;
f.Free;
end;


Вырезал только рабочую часть потока,там ничего такого особеного, кроме вызова функции из внешней dll.


 
PVOID   (2004-02-05 13:34) [4]

2Некто

Как его использовать? Что с чем синхронизировать?


 
PVOID   (2004-02-05 13:55) [5]

попробовал так

// f:tMyForm; объявляется в классе

Procedure tMyThread.Show;
begin
f.Show;
end;

Procedure tMyThread.Execute;
begin
f:=tMyForm.Create(Application)
while not terminated do
begin
// Здесь работаем, при этом, совем забыл вызываем функцию из сторонней dll
if(то-то то-то)then Synchronize(Show);
Sleep(1000);
end;
f.Free;
end;


теперь при команде Synchronize(Show) все вообще подвисет намертво.


 
panov ©   (2004-02-05 13:57) [6]

Обрати внимание на Никто (05.02.04 13:30) [2]

Он тебе правду сказал.


 
TUser ©   (2004-02-05 13:58) [7]

Надо так
procedure TYourThread.ShoForm;
befin
form.show;
end;

procedure Execute;
begin
synchr(Showform);
end;


 
PVOID   (2004-02-05 13:59) [8]

2panov

ну так я так и попробовал как он сказал. я понимаю что дело в этом, но что именно мне теперь делать? или это в принципе невозможно сделать?


 
PVOID   (2004-02-05 14:55) [9]

ну так что, никто не знает, что мне теперь делать?


 
Digitman ©   (2004-02-05 15:06) [10]


> Procedure tMyThread.Execute;
> begin
> f:=tMyForm.Create(Application) // зачем ИМЕННО здесь ? почему не в осн.потоке ?
> while not terminated do
> begin
> // Здесь работаем, при этом, совем забыл вызываем функцию
> из сторонней dll // там тоже, видимо, черт ногу сломит ..
> if(то-то то-то)then Synchronize(Show); //если "то-то то-то" примет значение True более 1-го раза, ЗАЧЕМ более N-й раз визуализировать уже видимую форму ?
> Sleep(1000); // это зачем ? почему не 50000 ? или не 50 ?
> end;
> f.Free; // почему без синхронизации ?
> end;


 
PVOID   (2004-02-05 15:23) [11]

2Digitman

> f:=tMyForm.Create(Application) // зачем ИМЕННО здесь ? почему не в осн.потоке ?
// >> Здесь потому что таких потоков несколько и у каждого своя форма.

> // Здесь работаем, при этом, совем забыл вызываем функцию
> из сторонней dll // там тоже, видимо, черт ногу сломит ..
>> Вот уж не знаю, библиотека майкрософтская

> if(то-то то-то)then Synchronize(Show); //если "то-то то-то" примет значение True более 1-го раза, ЗАЧЕМ более N-й раз визуализировать уже видимую форму ?
>> Потому что форму могут закрыть. Собственно форма это диалоговое окно с кнопкой Ok
> Sleep(1000); // это зачем ? почему не 50000 ? или не 50 ?
>> На самом деле здесь вместо Sleep(1000) стоит Sleep(interval*1000), это для того что бы вызывать сторонюю функцию с определенным интервалом.
> f.Free; // почему без синхронизации ?
>> А надо?


 
Silver Alex ©   (2004-02-05 15:26) [12]

while not terminated do
....
if(то-то то-то)then Synchronize(Show);
...
end;

ну разве не видно что в цикле вызывается*? потому и висит


 
PVOID   (2004-02-05 15:29) [13]

2SilverAlex

Это самое то-то то-то происходит в принципе один раз. Это и проверено и по определению. у самого сначала были такие же мысли. Нет, тут кажется дело в VCL, а я сним что-то не очень дружу. Вот то ли дело VC++ :D


 
Тимохов ©   (2004-02-05 15:38) [14]


> PVOID (05.02.04 15:29) [13]
> 2SilverAlex

То ли дело в VC++? :)))
Тебе нично не мешает здесь вызывать win api функции для создания окон, также как ты делаешь в VC++ :)))


 
PVOID   (2004-02-05 15:55) [15]

все госпада. разобрался. сделал чуть-чуть по другому и все заработалю. Всем спасибо за внимание

P.S. 2Тимохов

А так я потому и на VC++ данную весчь не делаю, что уж больно визуальная а мне с mfs связываться не охота


 
Digitman ©   (2004-02-05 15:57) [16]


> PVOID (05.02.04 15:23) [11]


> Потому что форму могут закрыть. Собственно форма это диалоговое
> окно с кнопкой Ok


и какова там реакция на Ok ?
склонен предположить, что за закрытием юзером окна формы у автоматически следует разрушение объекта-формы .. а следом, после выхода из цикла, ты ее пытаешься рушить повторно ... происходит необрабатываемое исключение, приводящее к таким вот печальным последствиям

поэтому возьми за непреложное правило - всегда заключать тело Execute в блок try..except, если предполагаешь непредвиденные ситуации, приводящие к неожидаемым тобой исключениям

try
... // все что угодно, теперь не страшно
except
on e:ecxeption do
MessageBox(0, pchar(e.classname + " " + e.message), "Непредвиденное исключение !", mb_ok or mb_setforeground);
end;


 
PVOID   (2004-02-05 16:59) [17]

2Digitman

не было никаких исключений и реакцией на Ok было просто caHide. Все, я все уже сделал, толко чуть по другому.


 
Digitman ©   (2004-02-05 17:01) [18]

ну сделал знач сделал ...
молодец



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

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

Наверх




Память: 0.51 MB
Время: 0.02 c
7-53790
Zaratustra
2003-11-30 15:02
2004.02.17
STDOUT и консольные приложения


1-53477
Dmitriy
2004-02-06 12:48
2004.02.17
Цикл по Edit ам...


11-53437
dataMaster
2003-06-02 12:57
2004.02.17
Как распечатать форму?


3-53431
Avreliy
2004-01-28 14:07
2004.02.17
Округление в FireBird


3-53392
Alex-kosmonavt
2004-01-27 10:59
2004.02.17
Покрасить строчку в DBGrid