Форум — Ответы ( К темам )
? | Андрей: Окна как процессы (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); } |