Конференция "KOL" » форма в отдельном потоке [Delphi, Windows]
 
  • Инна (07.10.09 13:02) [0]
    здравствуйте !
    хотела бы узнать как сделать дочернюю форму которая выполняется в отдельном потоке, чтоб например при выполнении цикла в этой форме-зависала только она

    p.s. принципиально интересует именно этот вариант а не applet.processmessages и прочее.
  • halex (07.10.09 14:11) [1]
    Не смотря на
    > p.s. принципиально интересует именно этот вариант а не applet.
    > processmessages и прочее.

    хочу заметить, что формы "зависать" не должны, и в отдельный поток нужно выносить именно "цикл", а не форму.
    PS
    Хотя было бы интересно взглянуть на задачу для, которой нужно было бы так извращаться.
  • Инна (07.10.09 15:20) [2]
    ну может про потоки это черезчур
    но нужна форма с отдельной очередью обработки сообщений никак
    не связаной с главной формой и аплетом,тоесть не блокирующая их, если вообще это возможно
  • abyss_by © (07.10.09 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;



    Чему чего присвоить думаю понятно без комментов. Здесь в потоке только то, что выполняется при вызове формы.
  • Инна (08.10.09 10:48) [4]
    спасиба :) в тесте вроде работает
    позже может еще чего уточню
  • Инна (08.10.09 11:26) [5]
    нет не то :( это просто отдельный поток
  • abyss_by © (09.10.09 17:15) [6]
    :) Что значит "просто отдельный поток"?
    function TForm3.ShowTollTips(Sender: pThread): integer;


    Здесь и обрабатывай свой цикл.
  • Инна (09.10.09 17:26) [7]

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

    мой цикл это очередь сообщений всей формы, вот че...
    тоесть некая хрень (драгдроп из проги) эту очередь останавливает напроч пока незавершица, поэтому и возник вопрос
    а запускается он как извесно перетягом мышькой-поэтому вынести это  просто в отдельный поток невозможно
  • abyss_by © (09.10.09 21:45) [8]
    Обработать событие драг-энд-дроп в отдельном потоке естественно можно. Но тебе, как я понял, нужно не это. Че там за секретный цикл, кусочек кода можешь скинуть? Или стучись сюда - 2117062, это ася.
  • Инна (10.10.09 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 © (10.10.09 13:55) [10]
    Как вариант с потоком, можно попробовать создать свой объект от TThread, где перебить Execute. Ты в VCL проекте используешь KOL?
  • Инна (10.10.09 15:21) [11]
    нет кол в коле
  • Barloggg (13.10.09 16:14) [12]
    ну, можно создать вторую форму в виде dll. так точняк все без проблем будет.
    особенность кол в том, что для dll придется создавать свой applet и вот вам пожалуйста собственная очередь сообщений. со всеми причитающими mousemove и тому подобное.
    на сайте есть пример формы в длл. в разделе "примеры".
  • Инна (14.10.09 12:55) [13]
    кстати бала такая мысль-вылетела из башки :)
    фишка работает,но в оригинале там форма создается пустая,а я подключала форму МСКшную ,может я чего не так сделала но сообщения от таймера она не получает :(

    да и делать дллху изза одной опции както не круто-неужели эти аплеты так нельзя разделить ???
  • Ruzzz © (16.10.09 04:49) [14]
    По поводу таймеров в книге по KOL глава 5.7. Часы (TTimer) - есть уточнение о работе таймеров в многопоточном приложении, может оно?
  • halex (16.10.09 12:20) [15]

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

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

    А почему нельзя запустить поток в Button1MouseDown?
 
Конференция "KOL" » форма в отдельном потоке [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]