-
здравствуйте ! хотела бы узнать как сделать дочернюю форму которая выполняется в отдельном потоке, чтоб например при выполнении цикла в этой форме-зависала только она
p.s. принципиально интересует именно этот вариант а не applet.processmessages и прочее.
-
Не смотря на > p.s. принципиально интересует именно этот вариант а не applet. > processmessages и прочее.
хочу заметить, что формы "зависать" не должны, и в отдельный поток нужно выносить именно "цикл", а не форму. PS Хотя было бы интересно взглянуть на задачу для, которой нужно было бы так извращаться.
-
ну может про потоки это черезчур но нужна форма с отдельной очередью обработки сообщений никак не связаной с главной формой и аплетом,тоесть не блокирующая их, если вообще это возможно
-
Была у меня подобная задача. Нужно было сделать выезжающее окошко над систреем, а-ля касперски. И вот если не в отдельном потоке, тормозила прогу безбожно, никакие " processmessages" не помогали. А так, без проблем :) Для формы, с выполнением задачи в отдельном потоке:
.....
private
ToolTipThread: PThread;
.....
procedure TForm3.FormShowHint;
begin
if Assigned(ToolTipThread) then
ToolTipThread.Terminate;
ToolTipThread := NewThreadAutofree(ShowTollTips);
ToolTipThread.PriorityClass := THREAD_PRIORITY_IDLE;
ToolTipThread.Threadpriority := THREAD_PRIORITY_LOWEST;
end;
function TForm3.ShowTollTips(Sender: pThread): integer;
begin
end;
procedure TForm3.KOLForm1Destroy(Sender: PObj);
begin
if Assigned(ToolTipThread) then ToolTipThread.Terminate;
end;
Создаем её: procedure TForm1.fShowHint;
begin
NewForm3( Form3, Applet );
Form3.FormShowHint;
end;
Чему чего присвоить думаю понятно без комментов. Здесь в потоке только то, что выполняется при вызове формы.
-
спасиба :) в тесте вроде работает позже может еще чего уточню
-
нет не то :( это просто отдельный поток
-
:) Что значит "просто отдельный поток"? function TForm3.ShowTollTips(Sender: pThread): integer; Здесь и обрабатывай свой цикл.
-
> Здесь и обрабатывай свой цикл.
мой цикл это очередь сообщений всей формы, вот че... тоесть некая хрень (драгдроп из проги) эту очередь останавливает напроч пока незавершица, поэтому и возник вопрос а запускается он как извесно перетягом мышькой-поэтому вынести это просто в отдельный поток невозможно
-
Обработать событие драг-энд-дроп в отдельном потоке естественно можно. Но тебе, как я понял, нужно не это. Че там за секретный цикл, кусочек кода можешь скинуть? Или стучись сюда - 2117062, это ася.
-
> Обработать событие драг-энд-дроп в отдельном потоке естественно > можно
на прием, да можно как угодно, а на отдачу неполучица цикла никакова нет, есть
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
-------------------------
DoDragDrop(DataObject,DropSource, DROPEFFECT_COPY, Effect);
---------------------
end;
где на DoDragDrop останавливается все, до тех пор пока DragDrop не закончится, в это время программа не получает события ввода,таймера,юзера и возможно еще чего то. поэтому и надо эту форму изолировать от остальных p.s. DoDragDrop нельзя запустить без нажатия мыши, поэтому и просто отдельный поток отпадает
-
Как вариант с потоком, можно попробовать создать свой объект от TThread, где перебить Execute. Ты в VCL проекте используешь KOL?
-
нет кол в коле
-
ну, можно создать вторую форму в виде dll. так точняк все без проблем будет. особенность кол в том, что для dll придется создавать свой applet и вот вам пожалуйста собственная очередь сообщений. со всеми причитающими mousemove и тому подобное. на сайте есть пример формы в длл. в разделе "примеры".
-
кстати бала такая мысль-вылетела из башки :) фишка работает,но в оригинале там форма создается пустая,а я подключала форму МСКшную ,может я чего не так сделала но сообщения от таймера она не получает :(
да и делать дллху изза одной опции както не круто-неужели эти аплеты так нельзя разделить ???
-
По поводу таймеров в книге по KOL глава 5.7. Часы (TTimer) - есть уточнение о работе таймеров в многопоточном приложении, может оно?
-
> DoDragDrop нельзя запустить без нажатия мыши, поэтому и > просто отдельный поток отпадает
Вы бы поделились минимальным приложением, а то если честно писать что-то ради кого-то, тупо лень.
А почему нельзя запустить поток в Button1MouseDown?
|