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

Вниз

форма в отдельном потоке   Найти похожие ветки 

 
Инна   (2009-10-07 13:02) [0]

здравствуйте !
хотела бы узнать как сделать дочернюю форму которая выполняется в отдельном потоке, чтоб например при выполнении цикла в этой форме-зависала только она

p.s. принципиально интересует именно этот вариант а не applet.processmessages и прочее.


 
halex   (2009-10-07 14:11) [1]

Не смотря на
> p.s. принципиально интересует именно этот вариант а не applet.
> processmessages и прочее.

хочу заметить, что формы "зависать" не должны, и в отдельный поток нужно выносить именно "цикл", а не форму.
PS
Хотя было бы интересно взглянуть на задачу для, которой нужно было бы так извращаться.


 
Инна   (2009-10-07 15:20) [2]

ну может про потоки это черезчур
но нужна форма с отдельной очередью обработки сообщений никак
не связаной с главной формой и аплетом,тоесть не блокирующая их, если вообще это возможно


 
abyss_by ©   (2009-10-07 20:41) [3]

Была у меня подобная задача. Нужно было сделать выезжающее окошко над систреем, а-ля касперски. И вот если не в отдельном потоке, тормозила прогу безбожно, никакие " 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-08 10:48) [4]

спасиба :) в тесте вроде работает
позже может еще чего уточню


 
Инна   (2009-10-08 11:26) [5]

нет не то :( это просто отдельный поток


 
abyss_by ©   (2009-10-09 17:15) [6]

:) Что значит "просто отдельный поток"?
function TForm3.ShowTollTips(Sender: pThread): integer;
Здесь и обрабатывай свой цикл.


 
Инна   (2009-10-09 17:26) [7]


> Здесь и обрабатывай свой цикл.

мой цикл это очередь сообщений всей формы, вот че...
тоесть некая хрень (драгдроп из проги) эту очередь останавливает напроч пока незавершица, поэтому и возник вопрос
а запускается он как извесно перетягом мышькой-поэтому вынести это  просто в отдельный поток невозможно


 
abyss_by ©   (2009-10-09 21:45) [8]

Обработать событие драг-энд-дроп в отдельном потоке естественно можно. Но тебе, как я понял, нужно не это. Че там за секретный цикл, кусочек кода можешь скинуть? Или стучись сюда - 2117062, это ася.


 
Инна   (2009-10-10 10:14) [9]


> Обработать событие драг-энд-дроп в отдельном потоке естественно
> можно

на прием, да можно как угодно, а на отдачу неполучица

цикла никакова нет, есть

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-10 13:55) [10]

Как вариант с потоком, можно попробовать создать свой объект от TThread, где перебить Execute. Ты в VCL проекте используешь KOL?


 
Инна   (2009-10-10 15:21) [11]

нет кол в коле


 
Barloggg   (2009-10-13 16:14) [12]

ну, можно создать вторую форму в виде dll. так точняк все без проблем будет.
особенность кол в том, что для dll придется создавать свой applet и вот вам пожалуйста собственная очередь сообщений. со всеми причитающими mousemove и тому подобное.
на сайте есть пример формы в длл. в разделе "примеры".


 
Инна   (2009-10-14 12:55) [13]

кстати бала такая мысль-вылетела из башки :)
фишка работает,но в оригинале там форма создается пустая,а я подключала форму МСКшную ,может я чего не так сделала но сообщения от таймера она не получает :(

да и делать дллху изза одной опции както не круто-неужели эти аплеты так нельзя разделить ???


 
Ruzzz ©   (2009-10-16 04:49) [14]

По поводу таймеров в книге по KOL глава 5.7. Часы (TTimer) - есть уточнение о работе таймеров в многопоточном приложении, может оно?


 
halex   (2009-10-16 12:20) [15]


> DoDragDrop нельзя запустить без нажатия мыши, поэтому и
> просто отдельный поток отпадает

Вы бы поделились минимальным приложением, а то если честно писать что-то ради кого-то, тупо лень.

А почему нельзя запустить поток в Button1MouseDown?



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

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

Наверх




Память: 0.5 MB
Время: 0.006 c
2-1385450524
Iriss
2013-11-26 11:22
2014.11.30
Не работает Pos


15-1397939403
Юрий
2014-04-20 00:30
2014.11.30
С днем рождения ! 20 апреля 2014 воскресенье


15-1397853003
Юрий
2014-04-19 00:30
2014.11.30
С днем рождения ! 19 апреля 2014 суббота


15-1397751666
KilkennyCat
2014-04-17 20:21
2014.11.30
Как правильно сделать запрос SQL


15-1397720688
ТНЕ картман
2014-04-17 11:44
2014.11.30
голосование))