![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
форма в отдельном потоке [Delphi, Windows]
Инна © (2009-10-07 13:02:00)здравствуйте !
хотела бы узнать как сделать дочернюю форму которая выполняется в отдельном потоке, чтоб например при выполнении цикла в этой форме-зависала только она
p.s. принципиально интересует именно этот вариант а не applet.processmessages и прочее.
halex (2009-10-16 12:20:00) [1]
> DoDragDrop нельзя запустить без нажатия мыши, поэтому и
> просто отдельный поток отпадает
Вы бы поделились минимальным приложением, а то если честно писать что-то ради кого-то, тупо лень.
А почему нельзя запустить поток в Button1MouseDown?
Ruzzz (2009-10-16 04:49:00) [2]По поводу таймеров в книге по KOL глава 5.7. Часы (TTimer) - есть уточнение о работе таймеров в многопоточном приложении, может оно?
Инна (2009-10-14 12:55:00) [3]кстати бала такая мысль-вылетела из башки :)
фишка работает,но в оригинале там форма создается пустая,а я подключала форму МСКшную ,может я чего не так сделала но сообщения от таймера она не получает :(
да и делать дллху изза одной опции както не круто-неужели эти аплеты так нельзя разделить ???
Barloggg (2009-10-13 16:14:00) [4]ну, можно создать вторую форму в виде dll. так точняк все без проблем будет.
особенность кол в том, что для dll придется создавать свой applet и вот вам пожалуйста собственная очередь сообщений. со всеми причитающими mousemove и тому подобное.
на сайте есть пример формы в длл. в разделе "примеры".
Инна (2009-10-10 15:21:00) [5]нет кол в коле
abyss_by (2009-10-10 13:55:00) [6]Как вариант с потоком, можно попробовать создать свой объект от TThread, где перебить Execute. Ты в VCL проекте используешь KOL?
Инна (2009-10-10 10:14:00) [7]
> Обработать событие драг-энд-дроп в отдельном потоке естественно
> можно
на прием, да можно как угодно, а на отдачу неполучица
цикла никакова нет, есть
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 нельзя запустить без нажатия мыши, поэтому и просто отдельный поток отпадает
abyss_by (2009-10-09 21:45:00) [8]Обработать событие драг-энд-дроп в отдельном потоке естественно можно. Но тебе, как я понял, нужно не это. Че там за секретный цикл, кусочек кода можешь скинуть? Или стучись сюда - 2117062, это ася.
Инна (2009-10-09 17:26:00) [9]
> Здесь и обрабатывай свой цикл.
мой цикл это очередь сообщений всей формы, вот че...
тоесть некая хрень (драгдроп из проги) эту очередь останавливает напроч пока незавершица, поэтому и возник вопрос
а запускается он как извесно перетягом мышькой-поэтому вынести это просто в отдельный поток невозможно
abyss_by (2009-10-09 17:15:00) [10]:) Что значит "просто отдельный поток"?
function TForm3.ShowTollTips(Sender: pThread): integer;
Здесь и обрабатывай свой цикл.
Инна (2009-10-08 11:26:00) [11]нет не то :( это просто отдельный поток
Инна (2009-10-08 10:48:00) [12]спасиба :) в тесте вроде работает
позже может еще чего уточню
abyss_by (2009-10-07 20:41:00) [13]Была у меня подобная задача. Нужно было сделать выезжающее окошко над систреем, а-ля касперски. И вот если не в отдельном потоке, тормозила прогу безбожно, никакие " 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;
Чему чего присвоить думаю понятно без комментов. Здесь в потоке только то, что выполняется при вызове формы.
Инна (2009-10-07 15:20:00) [14]ну может про потоки это черезчур
но нужна форма с отдельной очередью обработки сообщений никак
не связаной с главной формой и аплетом,тоесть не блокирующая их, если вообще это возможно
halex (2009-10-07 14:11:00) [15]Не смотря на
> p.s. принципиально интересует именно этот вариант а не applet.
> processmessages и прочее.
хочу заметить, что формы "зависать" не должны, и в отдельный поток нужно выносить именно "цикл", а не форму.
PS
Хотя было бы интересно взглянуть на задачу для, которой нужно было бы так извращаться.