Главная страница
    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.45 MB
Время: 0.033 c
1-1123429580
Андрей Молчанов
2005-08-07 19:46
2005.08.28
Как ловить сообщение, но не от формы, а от компонента


9-1114875564
Forexs
2005-04-30 19:39
2005.08.28
Вопрос по Forex-у


8-1112443806
dimka@cs
2005-04-02 16:10
2005.08.28
уровень громкости


9-1115431469
Anim
2005-05-07 06:04
2005.08.28
Как откомпилировать 3d character animator ?


1-1123592512
SkipKod
2005-08-09 17:01
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский