![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание формы в потоке, функция которого находится в DLL [D7]
_Андрей © (2005-08-09 19:15:00)Здравствуйте!
Необходимо создать форму(окно) в потоке, функция которого находится в 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?
Заранее спасибо!
DiamondShark (2005-08-09 20:34:00) [1]Я присоединяюсь к предыдущему оратору,
А от себя хочу спросить: с какой целью понадобился субж?
Может исходную задачу мы поможем решить менее трансректальным способом?
sniknik (2005-08-09 20:05:00) [2]VCL не "Thread Safe" компоненты, т.что формы в потоках надо создавать на "чистом" API/заменах типа Kol(хотя тут я не в курсе, может он аналогичен VCL-ю, надо в их форуме уточнить...)
а с VCL-лем, как ни извращайся, глюки/риск глюков все одно останется.
_Андрей (2005-08-09 19:21:00) [3]и еще одна ошибочка:
...
function GetThreadFunction(AppObj: integer):pointer;
begin
if not Assigned(DLLApp)
then begin
DLLApp:=Application;
Application:=TApplication(AppObj);
end;
Result:=@ThreadFunc;
end;
...
_Андрей (2005-08-09 19:19:00) [4]Немного ошибся в описании:
...
type
TGetThreadFunction=function(AppObj: integer):pointer;
...
и, естественно, поток после вызова функции BeginThread начинает работать не GetThreadFunction(), а в функции потока ThreadFunc, описанной в DLL.