Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.97
MaxxximyM
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
#1

Как дождаться завершения потока? - C++

10.08.2012, 22:59. Просмотров 4697. Ответов 13
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Thread(void* pParam);
 
void main(){
_beginthread(Thread, 0, NULL);//Запускаем поток, он выполняет свои задачи....
//Тут программа выполняет свои задачи...
...
//Тут надо дождаться завершения потока, после этого выполнить ещё несколько команд.
WaitForSingleObject(Thread, INFINITE);
...
}
 
void Thread(void* pParam){
.......Код
_endthread();
}
Какой функцией это осуществить?
Пробовал WaitForSingleObject, не получается.....
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 22:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как дождаться завершения потока? (C++):

Запуск нескольких независимых потоков. Дождаться завершения всех (C++ 11) - C++
Доброго времени суток. Подскажите, как запустить несколько независимых потоков, но дождаться, пока все завершатся? В каждом потоке есть...

Как получить код завершения процесса - C++
Привет форумчане. Подскажите если кто знает. Запускаю через CreateProcess монтирование образа при помощи TrueCrypt. Если скажем...

Вызывть метод одного потока из другого потока - C++
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1), который вызывает метод у обьекта, этот...

Дождаться появления окна и программно нажать на кнопку в нем - C++
насколько это реально и что нужно сделать? В игре DOTA2 перед тем как начать играть,появляется окно в котором нужно выбрать...

Как узнать статус потока? - C++
добрый вечер, не подскажите, как узнать статус потока? Желательно, чтобы функция возвращала 0, если поток засуспендин, или 1 если он...

Как освободить состояние потока ? - C++
Здравствуйте. Нужна помощь. Вот небольшая часть моей программы int nr_block; while (true) if (cin>>nr_block,cin.good()) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
10.08.2012, 23:33 #2
какой библиотекой пользуемся?

Добавлено через 42 секунды
и можно сделать чтобы по завершению поток сделал запись в переменную какую нить и смотреть.
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.08.2012, 23:48 #3
WaitForSingleObject ожидает в качестве параметра HANDLE события, а не void. создай событие в трэйде, и просигналь его. там где ждешь - тоже его создай (CreateEvent() задай имя, или имей в процессе не больше одного, тогда это - одно "безымянное" событие)
1
Avazart
Эксперт С++
7187 / 5361 / 280
Регистрация: 10.12.2010
Сообщений: 23,654
Записей в блоге: 17
11.08.2012, 01:12 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWORD WINAPI ThreadFunc(LPVOID IpParam)
{
//.....
return 0;
} 
//--------------------------------------------------------------------------- 
int main(int argc, char* argv[])
{
    DWORD thID;
    HANDLE hThread =CreateThread(NULL,0,ThreadFunc,0,0,&thID);
 
    WaitForSingleObject(hThread, INFINITE);
 
    return 0;
}
1
MaxxximyM
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
11.08.2012, 10:02  [ТС] #5
Avazart
Мне нужно именно через _beginthread, а не CreateThread. Но всё равно спасибо.

Invader_Zim
Через переменную можно, но пока поищу другой вариант.

novi4ok
Можно небольшой пример.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.08.2012, 10:04 #6
MaxxximyM, это и на _beginthread работает.
Почитай ещё про semaphore и mutex. Ещё есть critical section. Все эти три "штуки" позовляют дождаться завершения потока. Mutex даже "рекурсию" потока поддерживает
0
MaxxximyM
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
11.08.2012, 10:25  [ТС] #7
Разобрался.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void nikThread(void* pParam);
void login();
HANDLE sob;
 
 
void main(){
...
login();
..
}
 
void login(){
sob=CreateEvent(NULL,TRUE,FALSE,NULL);
_beginthread(nikThread, 0, NULL);
...
WaitForSingleObject(sob,INFINITE);
}
 
void nikThread(void* pParam){
...
SetEvent(sob);
_endthread();
}
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
11.08.2012, 10:30 #8
Дождаться потока с помощью WaitForSingleObject можно, если поток был создан вызовом _beginthreadex. Поток, созданный с помощью _beginthread дождаться этой ф-ей нельзя. Поэтому придется сигналить из потока о завершении.
2
Avazart
Эксперт С++
7187 / 5361 / 280
Регистрация: 10.12.2010
Сообщений: 23,654
Записей в блоге: 17
11.08.2012, 14:00 #9
Мне нужно именно через _beginthread, а не CreateThread.
Не понимаю чем вызвана такая необходимость?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.08.2012, 14:10 #10
Avazart, CreateThread - устаревшая функция, как мне известно и не очень ладит с синхронизацией
0
Avazart
Эксперт С++
7187 / 5361 / 280
Регистрация: 10.12.2010
Сообщений: 23,654
Записей в блоге: 17
11.08.2012, 14:15 #11
В каком плане? или мой пример не работет?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
11.08.2012, 14:28 #12
Цитата Сообщение от Avazart Посмотреть сообщение
В каком плане?
В документации (MSDN) писали страшилки про то, что многие функции из CRT не будут правильно работать при создании потока с помощью CreateThread(). Однако, как оказалось, всё не так страшно и неработающая функция только одно — signal(). Ну и кроме того небольшие утечки памяти на каждое создание потока могут происходить.
Источник: Description of using C Run-Time (CRT) functions and CreateThread ()

Добавлено через 2 минуты
Впрочем, всё-равно лучше использовать _beginthread() или _beginthreadex().
1
Avazart
Эксперт С++
7187 / 5361 / 280
Регистрация: 10.12.2010
Сообщений: 23,654
Записей в блоге: 17
11.08.2012, 14:32 #13
А что подразумевется под CRT ф-циями ?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
11.08.2012, 14:35 #14
C Run-Time. Функции из библиотеки языка C.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2012, 14:35
Привет! Вот еще темы с ответами:

чтение строки как потока - C++
Если у меня в текстовом файле (ifstream &fin) хранится какая-то последовательности n чисел, то я читаю её например так: for(int...

Если не вводится число, то закрыть ввод и дождаться конца программы - C++
так как программа будет с потоками надо дождаться конца программы, есть функция для ввода, так вот надо сделать так что если не вводится...

Как игнорировать ненужные данные из потока? - C++
Формат входной строки должен быть таким: Слово нужное_нам_число Например: windows 2012 Нужно из strStream потока присвоить...

Как задать локаль для потока? - C++
Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет. Если поставить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.08.2012, 14:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru