С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
 Аватар для BadCats
2 / 2 / 1
Регистрация: 31.01.2016
Сообщений: 119

Соотношение многопоточности приложения c++ и многопоточности на уровне системы?

13.10.2019, 15:29. Показов 3139. Ответов 7

Студворк — интернет-сервис помощи студентам
Возник следующий вопрос: в C++ существует два варианта работы с многопоточностью - std::theard и использование mutex. Но, оба этих варианта, как я понимаю, реализуют многопоточность в самом приложении - т.е работу с разделяемым объектом и доступа к нему нескольких потоков. Самый банальный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int number = 6;
 
void method1()
{
   mutex.lock();
number *= 5;
number /= 4;
mutex.unlock();
 }
 
void method2()
{
mutex.lock();
number *= 3;
number /= 2;
     mutex.unlock();
 }
но, опять же, он демонстрирует многопоточность в одной деннице трансляции.

Возникает следующий вопрос:

Как средствами c++ (Qt в частности) и посредством mutex или WinAPI организовать многопоточность с целью блокировки потока приложения и предотвращения создания ( повторного открытия этого приложения) в новом потоке в Windows?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2019, 15:29
Ответы с готовыми решениями:

Ошибка при попытке использования многопоточности в моделировании системы массового обслуживания
Всем привет! Попытался смоделировать СМО при одном источнике нагрузки со средним интервалом поступления заявок 0.5 и двумя обслуживающими...

по многопоточности
У меня есть анимация переходов... я её применил на боди и футер так сказать.. как сделать чтобы этот код выполнялся синхронно? public...

О многопоточности
Интересно, стало, а сколько всего потоков я могу открыть в своем проекте, существуют ли какие нибудь ограничения? и от чего зависит...

7
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2019, 16:02
Цитата Сообщение от BadCats Посмотреть сообщение
Как средствами c++ (Qt в частности) и посредством mutex или WinAPI организовать многопоточность с целью блокировки потока приложения и предотвращения создания ( повторного открытия этого приложения) в новом потоке в Windows?
Если коротко: о всем сказанном Выше забываем и используем QThread/QtConcurrent и сигналы-слоты.

А если развернуто то естественно можно использовать мютексы и атомики из STL, но это нужно реже учитывая то что плохо вяжется с приложением с GUI.
1
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,008
13.10.2019, 16:48
в Qt можно воспользоваться классами

QThead - поток
QMutex/QReadWriteLock/std::atomic - средства синхронизации
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.10.2019, 17:18
Цитата Сообщение от BadCats Посмотреть сообщение
с целью блокировки потока приложения и предотвращения создания ( повторного открытия этого приложения) в новом потоке в Windows?
Так это вообще просто, я в одном из проектов так делал. Перед выводом основного окна приложения ищем (через WinAPI) есть ли другое окно такого же приложения. Если есть-(приложение, к примеру работает но свернуто) то разворачиваем его а это уничтожаем. Что-то типа вот такого, как ниже.
C++ (Qt)
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
#include "MainWindow.h"
#include <QtWidgets>
#include <QApplication>
#include <QTranslator>
#include <QSettings>
#include "windows.h"
 
#include "SQliteManager.h"
#include "RegistrationManager.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationVersion(APP_VERSION);
    try{
        RegistrationManager regManager;
        if(!regManager.isRegistrationValid()){
            QTimer::singleShot(500,qApp, SLOT(quit()));
        }
 
        HWND hwnd=FindWindow(NULL, L"R8C Tool");
        if(hwnd){
            ShowWindow(hwnd, SW_RESTORE);
            return 0;
        }
 
        MainWindow w;
        w.show();
        return a.exec();
    }
    catch(...){
        QMessageBox::warning(0,QObject::tr("Warning"),QObject::tr("Generic application failure"));
        return -1;
    }
    return -1;
}
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2019, 17:35
insite2012, Такие вещи делаются через объекты синхронизации.
В Qt есть QSystemSemaphore.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2019, 18:17
Цитата Сообщение от BadCats Посмотреть сообщение
Как средствами c++ (Qt в частности) и посредством mutex или WinAPI организовать многопоточность с целью блокировки потока приложения и предотвращения создания ( повторного открытия этого приложения) в новом потоке в Windows?
Наверное ты имеешь ввиду процессы, а не потоки.
Просто создаёшь именованный мьютекс, CreateMutex. Если возникает ошибка ERROR_ALREADY_EXISTS, значит приложение уже запущено.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2019, 19:16
Лучший ответ Сообщение было отмечено BadCats как решение

Решение

Статьи:

https://habr.com/ru/post/173281/
https://evileg.com/ru/post/147/

Ну и исходники класса от какого того разработчика:

https://github.com/itay-grudev/SingleApplication


Но в С++Builder я вроде как использовал именно эветн(CreateEvent()), а не мутекс не помню почему.

Добавлено через 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
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
 
#define WM_MyDeskTopShow WM_USER+5
//---------------------------------------------------------------------------
USEFORM("UMyDeskTop.cpp", FMyDeskTop);
USEFORM("UStyleWindow.cpp", FStyleWindow);
USEFORM("UDebug.cpp", FDebug);
//---------------------------------------------------------------------------
const char *EVENT_NAME = "EventMyDeskTop21032012";
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
//------------------ Запущина ли копия программы ?----------------
        HWND  hEvent  = CreateEvent(0, FALSE, FALSE,EVENT_NAME);
        DWORD LastErr = GetLastError();
 
        if (LastErr == ERROR_ALREADY_EXISTS)
           {
            WaitForSingleObject(hEvent, INFINITE);
 
            HWND hDesk = FindWindow("TFMyDeskTop",NULL);
            if(hDesk)
              {
              COPYDATASTRUCT cd;
              String File = ParamStr(1);
              cd.cbData = File.Length();
              cd.lpData = File.c_str();
              // Передача имени файла
              SendMessage(hDesk, WM_COPYDATA, 0, (LPARAM)&cd);
              }
            SendMessage(hDesk,WM_MyDeskTopShow,0,0);// Сообщение о том что надо показать окно
 
            SetEvent(hEvent);
            CloseHandle(hEvent);
            return 0;
           }
//-----------------------------------------------------------
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->Title = "MyDeskTop";
        Application->CreateForm(__classid(TFMyDeskTop), &FMyDeskTop);
        Application->CreateForm(__classid(TFStyleWindow), &FStyleWindow);
        Application->CreateForm(__classid(TFDebug), &FDebug);
        SetEvent(hEvent); //
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    SetEvent(hEvent);           //
    CloseHandle(hEvent);        //
    return 0;
}
//---------------------------------------------------------------------------
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.10.2019, 20:01
Цитата Сообщение от Avazart Посмотреть сообщение
Такие вещи делаются через объекты синхронизации.
Согласен. Но иногда хочется поэкспериментировать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2019, 20:01
Помогаю со студенческими работами здесь

Организация многопоточности
Доброго времени суток, форумчане! Кто знаком с многопоточностью подскажите пожалуйста как лучше организовать многопоточность приложения,...

Часы многопоточности
Помогите пожалуйста. В проект хочу вставить часы, которые будут показывать часы и минуты(соответственно обновляются каждую минуту). Я знаю...

idHTTP в многопоточности
Всем привет. Я не супер-пупер знаток Delphi, так что прошу Вашей помощи :). Вообщем хочу написать, точнее уже пытался, но не получалось),...

Синхронизации многопоточности
добрый день, пытаюсь сделать синхронизацию потом на примере producer\consumer, но что-то не выходит, я в consumere сделал ожидания...

Производительность многопоточности
Доброго времени суток. Решил заняться многопоточностью, и натолкнулся на непонимание с производиельность Есть код в 2 потока: ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru