Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 2
Регистрация: 24.02.2016
Сообщений: 75

Как правильно создать поток?

09.02.2017, 08:55. Показов 2143. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий бесконечный цикл, который я хочу повесить его запуск и остановку на кнопки на форме
C++
1
cikl ();
у которого я хочу повесить запуск и остановку на кнопки на форме
C++
1
2
3
4
5
6
7
8
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 
                  cikl ();
                 
             }
    };
}
Прочитал что для бесконечного цикла лучше сделать отдельный поток. Как правильно объявить поток?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2017, 08:55
Ответы с готовыми решениями:

Как правильно создать отдельный поток и из него изменять форму?
Пробую создать поток так (вложение) но появляються ошибки ругаеться на _beginthread(UpdateData, 0, this); на UpdateData ...

Как создать поток вывода в RichTextBox Chart главной формы и как обращаться к этому потоку из других форм
Всем привет. Чтобы получить навыки многопоточного программирования, занялся такой задачкой: Я реализую условный чарт. Есть основная...

Как правильно создать поток с двумя параметрами
Проблема в том что как правильно мне создать поток. using System; using System.Collections.Generic; using System.ComponentModel; ...

2
33 / 33 / 18
Регистрация: 16.09.2015
Сообщений: 246
10.02.2017, 08:33
уверен вам подойдет BackgroundWorker который по большому счёту и является отдельным потоком, единственное, что работа с ним проще.
На msdn есть отличный пример
1
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
11.02.2017, 19:52
Программа ищет в многопоточном режиме число 2..5-значных чисел, а так же минимум и максимум в матрице, на каждую строку свой поток.

Используются события и атомарные операции.

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
#include <conio.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <process.h>
 
using namespace std;
 
void PrintMatr(size_t **matr, size_t rowsCount, size_t colsCount) {
    for (size_t i = 0; i < rowsCount; ++i) {
        for (size_t j = 0; j < colsCount; ++j) cout << matr[i][j] << " ";
        cout << endl;
    }
}
 
struct PARAM_STRUCT {
    size_t *Arr;
    size_t ColsCount;
};
 
volatile size_t CountNumbers = 0; // объект может быть изменен в программе аппаратным обеспечением
size_t MaxGeneral = 0, MinGeneral = 0xFFFFFFFF;
HANDLE hEvent;
 
DWORD WINAPI thread_start(CONST LPVOID lpParam) {
    PARAM_STRUCT *ParamStruct = (PARAM_STRUCT *)lpParam;
    size_t *TrArr = ParamStruct->Arr, n = ParamStruct->ColsCount,
        TrMin = TrArr[0], TrMax = TrArr[0], TrCount = 0;
 
    if (TrArr[0] > 99 && TrArr[0] < 1000) ++TrCount;
    for (size_t i = 1; i < n; ++i) {
        if (TrArr[i] > 99 && TrArr[i] < 1000) ++TrCount;
        if (TrArr[i] < TrMin) TrMin = TrArr[i];
        if (TrArr[i] > TrMax) TrMax = TrArr[i];
    }
    _InterlockedAdd((LONG *)&CountNumbers, TrCount);
    if (hEvent) {
        WaitForSingleObject(hEvent, INFINITE);
        if (TrMax > MaxGeneral) { Sleep(rand() % 30); MaxGeneral = TrMax; }
        if (TrMin < MinGeneral) { Sleep(rand() % 30); MinGeneral = TrMin; }
        SetEvent(hEvent);
    }
    ExitThread(0);
}
 
int main() {
    setlocale(0, "Rus"); srand((size_t)time(NULL));
    const size_t m = 64, n = 80, Item = (size_t)ceil(((double)m) / MAXIMUM_WAIT_OBJECTS) - 1;
    size_t Count = 0, Min = 1000000, Max = 0, **Matr = new size_t*[m];
 
    for (size_t i = 0; i < m; ++i) {
        Matr[i] = new size_t[n];
        for (size_t j = 0; j < n; ++j) Matr[i][j] = ((rand() << 16) | rand()) % Min;
    }
    //PrintMatr(Matr, m, n);
 
    for (size_t i = 0; i < m; ++i)
        for (size_t j = 0; j < n; ++j) {
            if (Matr[i][j] > 99 && Matr[i][j] < 1000) ++Count;
            if (Matr[i][j] < Min) Min = Matr[i][j];
            if (Matr[i][j] > Max) Max = Matr[i][j];
        }
    cout << "\nМинимум: " << Min << "; Максимум: " << Max << "; Трёхзначных: " << Count << "\n";
 
    hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
    if (hEvent == NULL) {
        cout << "Ошибка создания события\n\n";
        system("pause");
        return 1;
    }
 
    HANDLE hThreads[m]; PARAM_STRUCT paramStruct[m];
 
    for (size_t i = 0; i < m; ++i) {
        paramStruct[i].Arr = Matr[i];
        paramStruct[i].ColsCount = n;
        hThreads[i] = CreateThread(NULL, 0, &thread_start, &(paramStruct[i]), 0, NULL);
    }
    /* В массиве могут содержаться хэндлы на объекты разных типов, но многократное включение одного и того же хэндла считается ошибкой.
    DWORD WaitForMultipleObjects( // Ожидание мнжества объектов
        DWORD nCount,                        // Количество объектов в массиве, не более чем 64 = MAXIMUM_WAIT_OBJECTS
        const HANDLE* lpHandles, // Указатель на массив объектов
        BOOL bWaitAll,                   // Ждать всех?
        DWORD dwMilliseconds         // Время ожидания
    ); */
    for (size_t i = 0; i < Item; ++i) 
        WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, &(hThreads[i * MAXIMUM_WAIT_OBJECTS]), TRUE, INFINITE);
    WaitForMultipleObjects(m - Item * MAXIMUM_WAIT_OBJECTS, &(hThreads[Item * MAXIMUM_WAIT_OBJECTS]), TRUE, INFINITE);
 
    cout << "\nМинимум: " << MinGeneral << "; Максимум: " << MaxGeneral << "; 2-5-значных: " << CountNumbers << "\n\n";
    
    system("pause");
    CloseHandle(hEvent); for (size_t i = 0; i < m; ++i) delete[] Matr[i]; delete Matr;
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2017, 19:52
Помогаю со студенческими работами здесь

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Как правильно завершить поток
Всем привет. Что я делаю не так ? Поток запускается и работает хорошо, но вот при завершении программы она не закрывается, а зависает. Как...

Как правильно отправить в поток?
Приветы всем. Помогите разобраться с потоками на простом примере. Ситуация бывает такая, при открытии большого количества файлов,...

Как правильно закрыть поток
Доброго времени суток. Не могу закрыть поток в методе. private static int intScaner() { BufferedReader in = new...

Как правильно закончить поток?
Смотрите у меня будет класс в нем 2 действующих метода (ну и еще второстепенные), первый Exe этот метод что то выполняет (внутри цикл), а...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru