Форум: "Основная";
Текущий архив: 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