Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-53815
Avenger_NhT
2003-12-09 15:18
2004.02.17
включение TV-OUT


14-53757
Crusader
2004-01-17 16:15
2004.02.17
Зарплата


6-53665
Pavels
2003-12-15 12:54
2004.02.17
посылка письма из ActiveX


14-53767
zetovich
2004-01-30 12:55
2004.02.17
Как в ХР Проф на зашареный ресурс поставить пароль??


9-53348
Landgraph
2003-08-07 11:18
2004.02.17
Z координата...





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