Конференция "KOL" » корректное завершение [Delphi, Windows]
 
  • Delphuk © (11.12.07 12:49) [20]
    Понятно. Правда в асме я не силён и вставок сделать не смогу. Да к тому же интересно, как можно из самой же библиотеки заставить программу выгрузить эту же библиотеку? Попутно возник вопрос, а как можно вообще безболезненно завершить этот цикл обработки Run(Applet) ?
  • Vladimir Kladov © (11.12.07 16:06) [21]
    Есть вариант и без асма. Запустить в потоке, пусть там крутится обработчик сообщений вместе с апплетом И тогда сразу вернётся. Надо только учесть при взаимодействии с хост-приложением, если такое есть. Ну и поток правильно завершать.

    Честно если, я не знаю, как можно без минимального знания асма что-то серьёзное сделать. Надо же хотя бы теоретически представлять, в какие команды код с Паскаля превратится. Ведь Паскаль - это просто макроассемблер, просто навороченный.
  • Delphuk © (13.12.07 10:31) [22]
    Хорошо, сразу после сдачи сессии попробую работу с потоками, потом отпишусь :)

    P.S.
    Самым минимум знания асма конечно же есть (как то даже проигрываени песенки "кузнечик" писал на чистом асме)
  • Delphuk © (23.12.07 02:23) [23]
    Владимир Кладов, так ничего и не получается :( Пожалуйста, помогите справиться с этой ситуацией. Только из-за этого бага не выпускаю плагин в паблик.
  • Vladimir Kladov © (23.12.07 03:31) [24]
    Не могу сейчас, нет Delphi под рукой. (Смешно даже).
  • Vladimir Kladov © (23.12.07 06:54) [25]
    Вообще, я так понимаю, проблема корректного завершения потока? Думаю, надо послать потоку WM_QUIT, затем сделать thread.Wait;, после чего ему можено говорить Free, и возвращаться в хост-программу.
  • Delphuk © (23.12.07 09:48) [26]
    Владимир, смотрите как я делаю:


    var
     SettingsForm {$IFDEF KOL_MCK} : PSettingsForm {$ELSE} : TSettingsForm {$ENDIF} ;
     CanShow: Boolean = true;
     AnswerList: PStrList;

     // переменные для потока
     thID: DWORD;
     HThread: THandle;

    procedure ShowSettings; stdcall;
    .............................................
    //процедура создания и показа моего окна
    procedure ShowSettings; stdcall;
    begin
    CanShow := false;
    if Applet <> nil then Applet.Free;
    Applet := nil;
    AppletTerminated := false;
    Applet := NewApplet('');
    NewSettingsForm(SettingsForm, Applet);
    SettingsForm.Form.Show;
    Applet.Visible := false;
    Run(Applet);
    Applet.Free;
    Applet := nil;
    AppletTerminated := false;
    CanShow := true;
    ExitThread(0);
    end;
    .......................................
    //это процедурка, обработчик нажатия кнопки вызова формы плагина
    procedure OnButtonLeft(Handle: Integer; X,Y: Integer);
    begin
    if CanShow
    then
      HThread:= CreateThread(nil,0,@ShowSettings,nil,0,thID); //запускаем в потоке процедуру создания и показа формы
    else
      SettingsForm.Form.Show; //если форма открыта, то передаём ей фокус
    end;
    ..................
    //процедура которая вызывается при получении уведомления об отключении плагина
    procedure OnFinalize;
    begin
    if HThread <> 0
    then
      begin
       if not CanShow
       then
         SettingsForm.Form.Close;
       TerminateThread(HThread,0);
       MessageBox(0,'unload','dfdf',MB_ICONINFORMATION);
      end;
    end;



    Владимир, пожалуйста подскажите что изменить или покажите пример, как можно сделать по-другому.
  • Vladimir Kladov © (23.12.07 10:24) [27]
    Ладно посмотрю, но мне сейчас срочно надо по магазинам с семьёй - искать новогодние прибамбасы для сына типа костюма, для ёлки типа гирлянды...

    Сразу: я сказал, каак правильно поток завершать. Так у вас как минимум лик ресурсов может случиться. TerminateThread - это "последний выстрел", в том числе на API если поток делается. Поток должен сам себя закончить, это единственный правильный способ.
  • Delphuk © (23.12.07 11:20) [28]
    Владимир, заменил строчку TerminateThread(HThread,0); на HThread := 0; (поток и так норм зам закрывается, в конце процедурки написано же ExitThread(0); ) В общем вроде бы сейчас всё нормально, глюков и вылетов пока не заметил. Но правильный ли подход?
  • Delphuk © (23.12.07 14:08) [29]
    Всё же оказалось не так всё гладко, как хотелось бы. Теперь после обработки события ОнДаблКлик в ListView, который находится на форме (которая вызывается в потоке) происходит ошибка, хост приложение валится или ругается на нехватку ресурсов. Возвращаю всё как было (без потоков), работает на ура :(
  • Vladimir Kladov © (23.12.07 15:53) [30]
    а что вы делаете в ondblclick?
  • Delphuk © (23.12.07 16:05) [31]
    Вызываю процедуру из плагинного апи хост приложения (вызов окна с некоторой информацией). Там ошибок точно нет.
  • Delphuk © (23.12.07 16:14) [32]
    Вот обработчик по дабл клику:

    procedure TSettingsForm.LVMouseDblClk(Sender: PControl;
     var Mouse: TMouseEventData);
    begin
    if LV.LVCount < 1
    then
      exit;

    if (LV.LVCurItem = LV.LVFocusItem)
    then
      RQ_OpenContactInfo(Int2Str(LV.LVItemData[LV.LVFocusItem]));
    end;



    А вот сама процедура из апи хост приложения:

    procedure RQ_OpenContactInfo(uin: String);
    begin
    callStr(char(PM_CMD) + char(PC_SHOWINFO) + _istring(uin));
    end;



    P.S.
    В ListView находится один столбец с данными вида: Name(string)/Uin(integer)
  • Vladimir Kladov © (23.12.07 16:47) [33]
    Как я и подумал: вы пытаетесь напрямую вызывать callback в хостовом приложении. Но из другого потока этого делать не следует - последствия непредсказуемы. Вариант с потоком подойдёт только для случая, когда между формой в dll и хостовым приложением нет прямых call'ов до самого закрытия формы.
  • Delphuk © (23.12.07 16:53) [34]
    Тогда нужно искать другой выход, не через потоки. т.к. я просто не могу обойтись без call'ов. Остаётся только самый первый вариант, при котором всё отлично работает, но необходимо ручками закрывать окно. Пришли к тому, с чего начали :) Владимир, у вас есть ещё какие-нибудь предложения?
  • Vladimir Kladov © (23.12.07 17:29) [35]
    А я уже предлагал. Асм-вставкой сделать, помните?
  • Delphuk © (23.12.07 17:56) [36]
    Помню, но к сожалению мне это не по силам :(
 
Конференция "KOL" » корректное завершение [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]