Форум — Ответы     (  К темам )
 ?  Андрей: Окна как процессы (02-02-2003 19:43:10)
Необходимо сделать чтобы окна работали как отдельные процессы. Т.е. моя программа создает несколько одинаковых (от моего класса TSendFileForm потомка TForm) окон и каждое из них должно работать как отдельный процесс. Дело в том, что в каждом из окон может происходить очень длинный цикл (отправка и получение файлов). И поэтому надо чтобы они работали параллельно.
 Devnvd (03-02-2003 10:04:52)
Создавайте и удаляйте форму в самом потоке.
Сам же поток можете создавать разными способами:
1. CreateThread
2. _beginthread
3. TThread

Например так:
===========================
#include
#pragma hdrstop
#include

#include "Unit1.h"
#include "Unit2.h"
//-----------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString caption;
//Поток созданный через CreateThread
DWORD WINAPI ThreadProc(void *P)
{
MSG msg;
TForm2 *Form=new TForm2(0);
Form->Name=(char *)P;
Form->Caption=(char *)P;
Form->Show();
while(1)
{
BOOL bRet=GetMessage(&msg,(HWND)0,0,0);
if(bRet==0 || bRet==-1)break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(Form)delete Form;
Form=NULL;
return 0;
}
//-----------------------------------------
//Поток созданный через _beginthread
void ThreadProc2(void *P)
{
MSG msg;
TForm2 *Form=new TForm2(0);
Form->Name=(char *)P;
Form->Caption=(char *)P;
Form->Show();
while(1)
{
BOOL bRet=GetMessage(&msg,(HWND)0,0,0);
if(bRet==0 || bRet==-1)break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(Form)delete Form;
Form=NULL;
}
//--------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------
//Создаём поток через CreateThread
void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int i=0;
caption="ThreadForm"+IntToStr(i+1);
i++;
DWORD ThreadID;
HANDLE hThread=::CreateThread(0,0,ThreadProc,caption.c_str(),0,&ThreadID);
::SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL);
::CloseHandle(hThread); //Больше не нужен
}
//-------------------------------------------------
//Создаём поток через _beginthread
void __fastcall TForm1::Button2Click(TObject *Sender)
{
static int i=0;
caption="ThreadForm"+IntToStr(i+1);
i++;
HANDLE thread = (HANDLE)_beginthread(ThreadProc2,0,caption.c_str());
if(::SetThreadPriority(thread,THREAD_PRIORITY_NORMAL)==false)
ShowMessage("Error SetThreadPriority");
}
=======================
Форма которую вы создаёте в потоке должна при своём закрытии
послать сообщение о закрытии потока. Это делается с помощью
PostQuitMessage(0):
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
PostQuitMessage(0);
}