Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание потока из потока в Windows _beginthreadex()

50K
25 января 2012 года
Roman_pilot
16 / / 10.02.2010
Здравствуйте. У меня возник вопрос: в программе я создал поток А, а из него еще несколько потоков В. При запуске потока А родительский и дочерний поток выполняются параллельно, управление с окна программы не пропадает, однако при запуске потока В из потока А теряется управление в окне программы, при завершении потока В возвращается. При этом родительский поток не ждет завершения А, а А должен ждать завершения всех В (отмена данной команды проблему возврата управления окну не решает)
Потоки я создавал функцией
hClient_connect[nmb_cl]=(HANDLE)_beginthreadex(NULL, 0, &Client_service, (void*)&client_socket, 0, &ThreadID );
Я подозреваю, что первый атрибут функции beginthreadex SECURITY_ATTRIBUTES, который у меня в обоих случаях стоит NULL, влияет на передачу (наследование) доступа к управлению. Однако как там в действительности обстоит дело хз. В MSDN не особо понял, какие значения может принимать этот атрибут и что они означают.
Может кто знает, как можно дать управление всем потокам, или это не возможно в рамках этой функции?
20K
25 января 2012 года
sem2711
124 / / 23.09.2009
Цитата: Roman_pilot
Здравствуйте. У меня возник вопрос: в программе я создал поток А, а из него еще несколько потоков В. При запуске потока А родительский и дочерний поток выполняются параллельно, управление с окна программы не пропадает, однако при запуске потока В из потока А теряется управление в окне программы, при завершении потока В возвращается. При этом родительский поток не ждет завершения А, а А должен ждать завершения всех В (отмена данной команды проблему возврата управления окну не решает)


Довольно странное поведение программы, исходя из описанной вами схемы. Пока, не видя кода, могу предположить только одно - дело не в SECURITY_ATTRIBUTES. Если поток main, создавший окно и обрабатывающий сообщения от него, не ждет завершения потока A, то потоки, о существовании которых main даже не догадывается, никоим образом не могут повлиять на его "отзывчивость" (если только это не делается умышленно). Или я вашу схему не так понял? Да, еще вот что. Если поток main не ждет завершения A, то он (main) должен сразу же после запуска _beginthreadex(...) закрыть описатель потока A функцией CloseHandle.

50K
25 января 2012 года
Roman_pilot
16 / / 10.02.2010
Код:
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;
}

Вот код на всякий случай. Схему вы мою правильно поняли. Поток main не ждет завершения потока А и закрывает хандл сразу, однако main ничего не передает потоку А из адресов данных, поэтому А и без main все делает корректно.
277
25 января 2012 года
arrjj
1.7K / / 26.01.2011
А для чего формы создаешь в потоках 'B'? Ты им parent часом не указываешь свою главную форму? Показываешь их модально или просто Show()?
50K
25 января 2012 года
Roman_pilot
16 / / 10.02.2010
Да просто в классе формы у меня переменные сокетов записаны и другие нужные мне переменные, криво конечно, но переделывать желания не было. Формы эти не показываю, просто через них обращаюсь к функциям и переменным членам. Явно нигде не прописывал свойство Parent.
В общем действительно, проблема в этом: при создании новой формы пропадает управление. Видно нужно другой класс создать и с ним уже все действия производить.
Спасибо за помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог