Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
 Аватар для Sileighty
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 21

Приостановление выполнения потоков

23.06.2015, 17:15. Показов 6475. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Товарищи, есть задание, я считаю что все верно, но преподаватель говорит что выполнение не приостанавливается, а разве sleep не это делает? Подскажите как исправить, а то я что то не пойму
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*Вариант 1: Создать 2 потока: 1 выполняет суммирование и 2 выполняет умножение.
Из главного потока перевести потоки в приостановленное состояние,
далее через 3 секунды продолжить их выполнение, позволив корректно завершиться.*/
#include <windows.h>
#include <stdio.h>
 
 
HANDLE  hThread;
HANDLE  hThread2;
int sum_res;
int mlt_res;
 
DWORD WINAPI thr_sum(LPVOID lpParameter)
{
    sum_res = ((int*)lpParameter)[0] + ((int*)lpParameter)[1];
    return 1;
}
 
DWORD WINAPI thr_mlt(LPVOID lpParameter)
{
    mlt_res = ((int*)lpParameter)[0] * ((int*)lpParameter)[1];
    return 1;
}
 
int main(int argc, char** argv)
{
    DWORD thrSumId;
 
    int vals[2];
    vals[0] = 10;
    vals[1] = 5;
 
    hThread = CreateThread(NULL, 0, thr_sum, vals, 0, &thrSumId);
    if (hThread == NULL) throw;
    
    hThread2 = CreateThread(NULL, 0, thr_mlt, vals, 0, &thrSumId);
    if (hThread2 == NULL) throw;
 
    printf("start\n");
    DWORD res = WaitForSingleObject(hThread, 3000);
    DWORD res2 = WaitForSingleObject(hThread2, 3000);
    printf("wait 1");
    printf("wait 2\n");
    Sleep(3000);
    printf("result: %d\n", sum_res);
    printf("result: %d\n", mlt_res);
    Sleep(5000);
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2015, 17:15
Ответы с готовыми решениями:

Приостановление всех потоков
Здравствуйте уважаемые форумчани. Интересует такой вот вопрос: Возможно ли приостановить на некоторое время роботу всех потоков...

Приостановление выполнения программы
main = do &lt;- (map read . words) `fmap` getLine print (a+b) как сделать тут чтоб программа не закрывалась после вывода...

Приостановление выполнения функции
Создал для теста 2 формы на первой форме label1 и Command1 на второй Command1 и Text1 На первую форме нажимаем на кнопку...

3
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
23.06.2015, 18:10
Лучший ответ Сообщение было отмечено Sileighty как решение

Решение

Цитата Сообщение от Sileighty Посмотреть сообщение
а разве sleep не это делает?
функция Sleep приостанавливает тот поток, в котором она вызывается. Она ни как не влияет на твои созданные потоки. Чтобы приостоновить работу заданного потока используется SuspendThread, для возобновления работы потока ResumeThread.
Но в твоем случае оба потока после создания выполнятся за очень малый квант времени, то есть имеет смысл его создавать уже в приостановленном состоянии
C++
1
2
hThread = CreateThread(NULL, 0, thr_sum, vals, CREATE_SUSPENDED, &thrSumId);
hThread2 = CreateThread(NULL, 0, thr_mlt, vals, CREATE_SUSPENDED, &thrSumId);
и потом в главном потоке возобновляй их работу после прошествия определенного времени вызовом ResumeThread.
1
 Аватар для Sileighty
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 21
24.06.2015, 03:24  [ТС]
Цитата Сообщение от jonson Посмотреть сообщение
и потом в главном потоке возобновляй их работу после прошествия определенного времени вызовом ResumeThread.
Решил что лучше сделать наглядней, но как мне задать время ожидания ? ResumeThread принимает только один аргумент.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*Вариант 1: Создать 2 потока: 1 выполняет суммирование и 2 выполняет умножение.
Из главного потока перевести потоки в приостановленное состояние,
далее через 3 секунды продолжить их выполнение, позволив корректно завершиться.*/
#include <windows.h>
#include <stdio.h>
 
HANDLE  SumThread;
HANDLE  MltThread;
int sum_res;
int mlt_res;
 
DWORD WINAPI thr_sum(LPVOID lpParameter)
{
    sum_res = ((int*)lpParameter)[0] + ((int*)lpParameter)[1];
    return sum_res;
}
 
DWORD WINAPI thr_mlt(LPVOID lpParameter)
{
    mlt_res = ((int*)lpParameter)[0] * ((int*)lpParameter)[1];
    return mlt_res;
}
 
int main(int argc, char** argv)
{
    DWORD thrSumId;
 
    int vals[2];
    vals[0] = 10;
    vals[1] = 5;
 
    SumThread = CreateThread(NULL, NULL, thr_sum, vals, NULL, &thrSumId); // создаем 1-й поток
 
    if (SumThread == NULL) throw;
 
    MltThread = CreateThread(NULL, NULL, thr_mlt, vals, NULL, &thrSumId); // и 2-й
 
    if (MltThread == NULL) throw;
 
    SuspendThread(SumThread);
    SuspendThread(MltThread);
    printf("stop thread 1 & 2\n");
    ResumeThread(SumThread);
    ResumeThread(MltThread);
 
    DWORD res = WaitForSingleObject(SumThread,5000);
    DWORD res2 = WaitForSingleObject(MltThread, 5000);
    printf("result: %d\n", sum_res);
    printf("result: %d\n", mlt_res);
    
    return 0;
}
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
24.06.2015, 10:48
Цитата Сообщение от jonson Посмотреть сообщение
функция Sleep приостанавливает тот поток, в котором она вызывается.
вот и задержи главный поток до вызова ResumeThread
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2015, 10:48
Помогаю со студенческими работами здесь

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

Разделение потоков выполнения
Как можно сделать, что бы пока выполняется один код программы например большой for, то программа не зависала?

Последовательность выполнения потоков
Есть примерно такой код: void Replicate(string sometext) { Thread thread1 = new...

Разделить время выполнения потоков
Я только начал изучать потоки, так что возможно это нубский вопрос, но как организовать чтобы если работает только один поток, то весь...

Блокирование потоков выполнения в node.js
Доброго времени суток. Мне нужно написать модуль, который поможет разработчику определить, что в приложении происходит блокирование...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru