Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

Создание формы в потоке, функция которого находится в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.034 c
1-1123482790
rolex
2005-08-08 10:33
2005.08.28
Как в TreeView загрузить дерево папок?


14-1123348504
lookin
2005-08-06 21:15
2005.08.28
Подсветка элементов в Code Insight


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


3-1121373663
Kraft
2005-07-15 00:41
2005.08.28
Функция Locate


14-1123146950
Layner
2005-08-04 13:15
2005.08.28
Под Москвой выселяют дачников из незаконно постр. котеджей.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский