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

Вниз

Создание формы в потоке, функция которого находится в DLL   Найти похожие ветки 

 
_Андрей   (2005-08-09 19:15) [0]

Здравствуйте!
Необходимо создать форму(окно) в потоке, функция которого находится в DLL.
Описание формы находится в библиотеке DLL. Функция потока также находится в этой DLL. Сам поток запускается из основного потока. Проблема в том, что возникает ошибка при попытке создать форму. Приведу пример кода.
Модуль описания формы, функции потока и код DLL:

 ...
 type
   TMyForm = class(TForm)
     ...
   end;
 ...
 function ThreadFunc(lpParams: pointer):DWORD;
 var MyForm: TMyForm;
 begin
  ...
  try
    MyForm := TMyForm.Create(Application);
  except
    ...
  end;
  ...
 end;
 ...
 var DLLApp: TApplication;
 ...
 function GetThreadFunction(AppObj: integer):pointer;
 begin
   if not Assigned(DLLApp) then DLLApp:=TApplication(AppObj);
   Result:=@ThreadFunc;
 end;
 ...
 exports
   GetThreadFunction;
 ...

Создание потока из основного потока:

 ...
 type
   TGetThreadFunction(AppObj: integer):pointer;
 ...
 var
   hThread: THandle;
   lpGetThreadFunction: TGetThreadFunction;
   lpFunc  : pointer;
 ...
 @lpGetThreadFunction:=GetProcAddres(hDLL,"GetThreadFunction");
 lpFunc:=lpGetThreadFunction(integer(Application));
 hThread:=BeginThread(..
                      lpFunc,
                      ..);
 ...

Сам поток создается и начинает своё выполнение в функции GetThreadFunction, которая описана в DLL, но вот объект формы TMyForm не создается - возникает исключение.
Может кто знает как все-таки создать форму в потоке, код которого должен выполняться в DLL?
Заранее спасибо!


 
_Андрей   (2005-08-09 19:19) [1]

Немного ошибся в описании:

 ...
 type
  TGetThreadFunction=function(AppObj: integer):pointer;
 ...

и, естественно, поток после вызова функции BeginThread начинает работать не GetThreadFunction(), а в функции потока ThreadFunc, описанной в DLL.


 
_Андрей   (2005-08-09 19:21) [2]

и еще одна ошибочка:

...
function GetThreadFunction(AppObj: integer):pointer;
begin
  if not Assigned(DLLApp)
  then begin
    DLLApp:=Application;
    Application:=TApplication(AppObj);
  end;
  Result:=@ThreadFunc;
end;
...


 
sniknik ©   (2005-08-09 20:05) [3]

VCL не "Thread Safe" компоненты, т.что формы в потоках надо создавать на "чистом" API/заменах типа Kol(хотя тут я не в курсе, может он аналогичен VCL-ю, надо в их форуме уточнить...)
а с VCL-лем, как ни извращайся, глюки/риск глюков все одно останется.


 
DiamondShark ©   (2005-08-09 20:34) [4]

Я присоединяюсь к предыдущему оратору,
А от себя хочу спросить: с какой целью понадобился субж?

Может исходную задачу мы поможем решить менее трансректальным способом?



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

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

Наверх




Память: 0.48 MB
Время: 0.03 c
3-1121689295
RusLAN_
2005-07-18 16:21
2005.08.28
DBF в ДОС кодировке. Параметры подключения.


3-1121605921
Jet
2005-07-17 17:12
2005.08.28
Access - объединение двух баз


14-1123228858
boriskb
2005-08-05 12:00
2005.08.28
С кем бы вы хотели поговорить?


10-1100616891
MegaLexx
2004-11-16 17:54
2005.08.28
Нетривиальный (то бишь неправильный) импорт ActiveX компонента


4-1120725661
AxelBlack
2005-07-07 12:41
2005.08.28
NetServerEnum