class TForm1 : public TForm
{
__published: // IDE-managed Components
...
private: // User declarations
...
public: // User declarations
static unsigned __stdcall Start_server(void* pParam);
static unsigned __stdcall Client_service(void* pParam);
...
} ;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
...
HANDLE hStart_server;
unsigned ThreadID;
hStart_server= (HANDLE)_beginthreadex(NULL, 0, &Start_server, NULL, 0, &ThreadID );
CloseHandle( hStart_server );
}
unsigned __stdcall TForm1::Start_server(void* pParam)
{
...
unsigned *aThreadID;
HANDLE *hClient_connect;
hClient_connect=new HANDLE[10];
unsigned ThreadID;
int nmb_cl=0;
while (OnStartStop&&(nmb_cl<10))
{
client_socket=accept(server_socket, (sockaddr *) &client_addr, &client_addr_size);
hClient_connect[nmb_cl]=(HANDLE)_beginthreadex(NULL, 0, &Client_service, (void*)&client_socket, 0, &ThreadID );
nmb_cl++;
}
for (int i = 0; i < nmb_cl; i++) {
WaitForSingleObject( hClient_connect, INFINITE );
CloseHandle(hClient_connect);
}
delete[] hClient_connect;
...
_endthreadex( 0 );
return 0;
}
unsigned __stdcall TForm1::Client_service(void* client_socket)
{
TForm1 *client_func;
client_func=new TForm1();
Form1->RichEdit1->Lines->Add("client is connected");
client_func->sock=((SOCKET *) client_socket)[0];
...
delete client_func;
_endthreadex( 0 );
return 0;
}
Создание потока из потока в Windows _beginthreadex()
Потоки я создавал функцией
hClient_connect[nmb_cl]=(HANDLE)_beginthreadex(NULL, 0, &Client_service, (void*)&client_socket, 0, &ThreadID );
Я подозреваю, что первый атрибут функции beginthreadex SECURITY_ATTRIBUTES, который у меня в обоих случаях стоит NULL, влияет на передачу (наследование) доступа к управлению. Однако как там в действительности обстоит дело хз. В MSDN не особо понял, какие значения может принимать этот атрибут и что они означают.
Может кто знает, как можно дать управление всем потокам, или это не возможно в рамках этой функции?
Цитата: Roman_pilot
Здравствуйте. У меня возник вопрос: в программе я создал поток А, а из него еще несколько потоков В. При запуске потока А родительский и дочерний поток выполняются параллельно, управление с окна программы не пропадает, однако при запуске потока В из потока А теряется управление в окне программы, при завершении потока В возвращается. При этом родительский поток не ждет завершения А, а А должен ждать завершения всех В (отмена данной команды проблему возврата управления окну не решает)
Довольно странное поведение программы, исходя из описанной вами схемы. Пока, не видя кода, могу предположить только одно - дело не в SECURITY_ATTRIBUTES. Если поток main, создавший окно и обрабатывающий сообщения от него, не ждет завершения потока A, то потоки, о существовании которых main даже не догадывается, никоим образом не могут повлиять на его "отзывчивость" (если только это не делается умышленно). Или я вашу схему не так понял? Да, еще вот что. Если поток main не ждет завершения A, то он (main) должен сразу же после запуска _beginthreadex(...) закрыть описатель потока A функцией CloseHandle.
Код:
Вот код на всякий случай. Схему вы мою правильно поняли. Поток main не ждет завершения потока А и закрывает хандл сразу, однако main ничего не передает потоку А из адресов данных, поэтому А и без main все делает корректно.
А для чего формы создаешь в потоках 'B'? Ты им parent часом не указываешь свою главную форму? Показываешь их модально или просто Show()?
В общем действительно, проблема в этом: при создании новой формы пропадает управление. Видно нужно другой класс создать и с ним уже все действия производить.
Спасибо за помощь.