Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Внизформа и 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c