Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91

Отсоединение потока

16.08.2017, 17:51. Показов 2042. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Существует ли способ отсоединить поток, присоединённый с помощью .join()?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2017, 17:51
Ответы с готовыми решениями:

отсоединение от файлов
Извините если подобная тема уже была создана где-то но я не нашел такой. Я использовал команду freopen для подключения файла и ввода в файл...

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

Создание потока из потока.
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в коде вообще ничего нет ) ругается...

12
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
16.08.2017, 18:01
Лучший ответ Сообщение было отмечено Oleg Pridarun как решение

Решение

Oleg Pridarun, нет. А зачем вам это нужно? Если требуется такое сделать, то у вас какие-то проблемы с логикой приложения
0
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91
16.08.2017, 18:09  [ТС]
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Oleg Pridarun, нет. А зачем вам это нужно? Если требуется такое сделать, то у вас какие-то проблемы с логикой приложения
Мне надо присоединить поток (иначе получаю исключение), но после того, как он должен завершиться программа не продолжается, а "стоит". Мне кажется, что это происходит из-за того, что после присоединения поток не может завершиться, пока не завершился поток, к которому он присоединён. В то время поток, к которому присоединён другой ждёт его завершения (Дожидаться завершения приходится, так как присоединяемый поток является счётчиком, и после определённого значения счётчик должен остановиться, далее присоединяющий поток производит некоторые действия и завершается)

P.S. Во время работы счётчика производятся и другие действия в других потоках
0
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
16.08.2017, 18:16
Цитата Сообщение от Oleg Pridarun Посмотреть сообщение
после присоединения поток не может завершиться, пока не завершился поток, к которому он присоединён
В общем случае, поведение присоединённого потока никак не зависит от "родительского".
Возможно, вы в своём коде каким-либо образом организовали deadlock (например, набедокурили с примитивами синхронизации). Чтобы помочь вам, мне нужно увидеть код
0
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91
16.08.2017, 18:21  [ТС]
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
В общем случае, поведение присоединённого потока никак не зависит от "родительского".
Возможно, вы в своём коде каким-либо образом организовали deadlock (например, набедокурили с примитивами синхронизации). Чтобы помочь вам, мне нужно увидеть код
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
 
#include <iostream>
#include <thread>
#include <Windows.h>
#include "Errors.h"
#include <conio.h>
#include <string>
#include "mainGame.h"
#include "globalSettings.h"
#include <mutex>
#include <condition_variable>
 
using namespace std;
 
//Объект для остановки потока
condition_variable wt;
 
int tst;
int tst2;
string couttst;
 
//Переменные времени
int hour = 9, minit = 0;
 
//Проверка работы счётчика времени
bool timeCntCheck = true;
 
//Прототипы функций
void drawTime();
void draw();
void drawCycle();
void logic();
void mainGame(int lvlNum);
 
//Счёт времени
void timeCnt(mutex& mtx)
{
    //Цикл времени
    do
    {
        //Синхронизация
        unique_lock<mutex> ulm(mtx);
 
        //Счёт
        minit++;
 
        //Проверка на увеличение часа
        if (minit > 59)
        {
            minit = 0;
            hour++;
        }
        //Проверка на фатальную ошибку
        else if (minit < 0)
            fatalError();
    
        //Проверка на конец игры
        if (hour >= 18)
        {
            hour = 0;
            timeCntCheck = false;
            wt.wait(ulm);
        }
        //Проверка на фатальную ошибку
        else if (hour < 9)
            fatalError();
 
        //Длительность минуты
        Sleep(9);
    } while (timeCntCheck);
}
 
//Логика игры
void logic()
{
    while (timeCntCheck)
    {
        tst = 1 + rand() % 2;
        tst2 = 1 + rand() % 2;
 
        if (_getch() == 'q')
            couttst = "test";
        else couttst = "test2";
    }
}
 
//Прорисовка изображения игры
void drawCycle()
{
    while (timeCntCheck)
    {
        draw();
    }
}
 
//Изображение игры
void draw()
{
    cout << tst << endl;
    drawTime();
    cout << tst2 << endl;
    cout << couttst;
    system("cls");
}
 
//Изображение времени
void drawTime()
{
    cout << hour << ":" << minit << endl << endl;
}
 
//Главное тело игры
bool game()
{
    //Синхронизация потоков
    mutex mtx;
 
    //Создание потока для счётчика времени
    thread thrdTime(timeCnt, ref(mtx));
    thread thrdLogic(logic);
    thread thrdDraw(drawCycle);
 
    if (thrdTime.joinable())
    {
        thrdTime.join();
    }
 
    //Запуск нового дня
    lvl++;
    mainGame(lvl);
 
    return true;
}
Вложения
Тип файла: zip name_please.zip (6.6 Кб, 3 просмотров)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
16.08.2017, 19:45
Цитата Сообщение от Oleg Pridarun Посмотреть сообщение
программа не продолжается, а "стоит".
В game() вызывается mainGame(), а в mainGame() вызывается game()?
0
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91
16.08.2017, 21:03  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
В game() вызывается mainGame(), а в mainGame() вызывается game()?
Ну да. В mainGame вызываются дни, в которых происходит какой-то сюжет, потом запускается основная часть игры (как в pepers, please, где основной геймплей однотипен, только правила слегка меняются)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.08.2017, 03:25
Цитата Сообщение от Oleg Pridarun Посмотреть сообщение
C++
1
wt.wait(ulm);
И как поток должен выйти из этого ожидания?
0
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91
17.08.2017, 07:50  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
И как поток должен выйти из этого ожидания?
Без ожидания ничего не меняется, всё также
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.08.2017, 08:09
Oleg Pridarun, значит это не весь код.
Да и предоставленный код не потокобезопасен.
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
17.08.2017, 10:05
Лучший ответ Сообщение было отмечено Oleg Pridarun как решение

Решение

Oleg Pridarun, я считаю что у вас изначально не тот подход, во первых, зачем создавать поток счета времени, когда есть написаные таймеры, во вторых набор правил в вашей игре можно реализовать с помощью ооп у вас есть класс игра, в нем стэк правил, ну и класс правило, добавляя просто новый элемент, вы добавляете правило, и касательного того джоина что вы делаете, наскольк я понял вы говорили про джоин в объекте thrdTime, таймер вообще должен делать detach после того как вы его создали, советую просто не велосипедить а воспользоватся готовыми таймерами

Добавлено через 8 минут
Вообще если вы хотите ограничить игру как то по времени то вам просто нужно замерять время кадра
C++
1
2
3
4
clock_t start = clock();
//рисование
//логики
float elapsed = (clock() - start) / (float)CLOCKS_PER_SEC;//реальное прошедшее время в секундах
и потом сумируете прошедщее время кадра к общему времени игры прошедшему, а когда оно перевалит за вашу границу то завершаете игру или что то делаете
1
2 / 2 / 1
Регистрация: 16.06.2016
Сообщений: 91
17.08.2017, 13:27  [ТС]
Спасибо за помощь
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.08.2017, 14:54
Цитата Сообщение от Oleg Pridarun Посмотреть сообщение
Без ожидания ничего не меняется, всё также
Сказки не рассказывай. На вопрос не ответил:
Цитата Сообщение от nd2 Посмотреть сообщение
И как поток должен выйти из этого ожидания?
Цитата Сообщение от Oleg Pridarun Посмотреть сообщение
//Синхронизация
C++
1
unique_lock<mutex> ulm(mtx);
Мьютекс, который здесь используется, используется в одном месте кода, в одном потоке. Что и с чем ты тогда синхронизируешь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2017, 14:54
Помогаю со студенческими работами здесь

Два потока, две очереди, два потока
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из...

Отсоединение потока от одного события и присоединить к другому событию
Здраствуйте как можно сделать такое, у меня есть массив из DispatcherTimer к каждому инедксу привязано событие. Я хочу определённый поток...

Отсоединение и присоединение к другим
Привет все. Нужна Ваша помощь.Первый раз сталкиваюсь с оными программами и вообще с телефонией в частности. По маленьку разбираю ее. Но тут...

UDP и физическое отсоединение кабеля
Есть программа посылающая пакету UDP на уд.хост, как программно отследить физическое отсоединение кабеля для того что бы прервать отправку...

Программное отсоединение базы данных
Доброго времени суток Подскажите пожалуйста, как можно программно отсоединить базу данных Т.е., для подключения использую строку: ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru