-
Понятно. Правда в асме я не силён и вставок сделать не смогу. Да к тому же интересно, как можно из самой же библиотеки заставить программу выгрузить эту же библиотеку? Попутно возник вопрос, а как можно вообще безболезненно завершить этот цикл обработки Run(Applet) ?
-
Есть вариант и без асма. Запустить в потоке, пусть там крутится обработчик сообщений вместе с апплетом И тогда сразу вернётся. Надо только учесть при взаимодействии с хост-приложением, если такое есть. Ну и поток правильно завершать.
Честно если, я не знаю, как можно без минимального знания асма что-то серьёзное сделать. Надо же хотя бы теоретически представлять, в какие команды код с Паскаля превратится. Ведь Паскаль - это просто макроассемблер, просто навороченный.
-
Хорошо, сразу после сдачи сессии попробую работу с потоками, потом отпишусь :)
P.S. Самым минимум знания асма конечно же есть (как то даже проигрываени песенки "кузнечик" писал на чистом асме)
-
Владимир Кладов, так ничего и не получается :( Пожалуйста, помогите справиться с этой ситуацией. Только из-за этого бага не выпускаю плагин в паблик.
-
Не могу сейчас, нет Delphi под рукой. (Смешно даже).
-
Вообще, я так понимаю, проблема корректного завершения потока? Думаю, надо послать потоку WM_QUIT, затем сделать thread.Wait;, после чего ему можено говорить Free, и возвращаться в хост-программу.
-
Владимир, смотрите как я делаю:
var
SettingsForm : PSettingsForm : TSettingsForm ;
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;
Владимир, пожалуйста подскажите что изменить или покажите пример, как можно сделать по-другому.
-
Ладно посмотрю, но мне сейчас срочно надо по магазинам с семьёй - искать новогодние прибамбасы для сына типа костюма, для ёлки типа гирлянды...
Сразу: я сказал, каак правильно поток завершать. Так у вас как минимум лик ресурсов может случиться. TerminateThread - это "последний выстрел", в том числе на API если поток делается. Поток должен сам себя закончить, это единственный правильный способ.
-
Владимир, заменил строчку TerminateThread(HThread,0); на HThread := 0; (поток и так норм зам закрывается, в конце процедурки написано же ExitThread(0); ) В общем вроде бы сейчас всё нормально, глюков и вылетов пока не заметил. Но правильный ли подход?
-
Всё же оказалось не так всё гладко, как хотелось бы. Теперь после обработки события ОнДаблКлик в ListView, который находится на форме (которая вызывается в потоке) происходит ошибка, хост приложение валится или ругается на нехватку ресурсов. Возвращаю всё как было (без потоков), работает на ура :(
-
а что вы делаете в ondblclick?
-
Вызываю процедуру из плагинного апи хост приложения (вызов окна с некоторой информацией). Там ошибок точно нет.
-
Вот обработчик по дабл клику:
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)
-
Как я и подумал: вы пытаетесь напрямую вызывать callback в хостовом приложении. Но из другого потока этого делать не следует - последствия непредсказуемы. Вариант с потоком подойдёт только для случая, когда между формой в dll и хостовым приложением нет прямых call'ов до самого закрытия формы.
-
Тогда нужно искать другой выход, не через потоки. т.к. я просто не могу обойтись без call'ов. Остаётся только самый первый вариант, при котором всё отлично работает, но необходимо ручками закрывать окно. Пришли к тому, с чего начали :) Владимир, у вас есть ещё какие-нибудь предложения?
-
А я уже предлагал. Асм-вставкой сделать, помните?
-
Помню, но к сожалению мне это не по силам :(
|