Главная страница
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.076 c
8-1113919174
MAXIMUM666
2005-04-19 17:59
2005.08.28
Зацикливание


3-1121245570
WondeRu
2005-07-13 13:06
2005.08.28
Трудности перевода 2. BDE->ADO


3-1121700666
ali_tash
2005-07-18 19:31
2005.08.28
Как задекларировать BASED ON переменную


14-1122974932
Ajax
2005-08-02 13:28
2005.08.28
beat detection algorithms


14-1123461675
BoAlSe
2005-08-08 04:41
2005.08.28
Обидно, что уходят самые достойные