Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 08.12.2009
Сообщений: 5

Как в VS 2008 создать поток?

11.12.2009, 22:09. Показов 6259. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

IDE - Visual Studio 2008 C++
OS - Windows XP

Я в С++ новичёк, вот разбираюсь с потоками.
В общем "концепция" ясна. Поток - это такая штука с помощью которой можно распараллеливать задачи. То есть, если в компьютере есть 2 и больше ядер или процессоров, то можно их нагрузить, что бы они работали параллельно, и соответственно ускорить выполнение программы.

Проблема состоит в следующем, никак не могу понять как выглядит алгоритм распараллеливания. Знаю что есть функция createThread, так же знаю что её не рекомендуется использовать если в коде используются стандартные функции библиотеки С, такие как например printf() или strcmp(). Проблема в том что функции стандартной библиотеки С не предназначены для использования в Win32 АРІ, и для того чтобы создать поток необходимо во время создания и завершения потока выполнять некоторые действия, все эти действия уже включены в функцию _beginthreadex() для создания потока и _endthreadex() – для завершения потока. эти функции описаны в ргосеss.h

Вот я пришел к тому что мне нужна функция _beginthreadex(). Читал MSDN. Есть примеры программ с использованием потоков.

Программа находит сумму ветора чисел, который состоит не более чем из 8-ми элементов при помощи потоков. Ми имеем массив а[], и ячейки памяти mem.


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
#include <windows.h>
#include <process.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
int number1 = 9,number2 = 1,numb=0;
int proc1,proc2,k=0,mem[10];
unsigned tid;
HANDLE Thread[8];
DWORD res;
int i,p=2,A,B,a[8];
 
unsigned __stdcall Sum( void * arg)   // Функция потока
{
        proc1=a[k];
        proc2=a[k+1];
        mem[k]=proc1+proc2;
        cout<<"Ячейка памяти[ "<<i<<" ]"<<mem[k]<<endl;
        k+=2;
    return 0;
 
};
unsigned __stdcall Sum2( void * arg)   // Функция потока
{
        proc1=mem[k];
        proc2=mem[k+p];
        mem[k]=proc1+proc2;
        cout<<"Ячейка памяти[ "<<i<<" ]"<<mem[k]<<endl;
        k+=4;
    return 0;
 
};
 
int main()
{       SetConsoleOutputCP(1251);
        cout<<"Введите количество чисел (до восьми)\n";
        cin>>A;
        cout<<"Введите числа\n";
        for (i=0;i<8;i++){
        a[i]=0;
        }
        for (i=0;i<A;i++){
        cin>>a[i];
        }
 
        for (i=0;i<4;i++){
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum, 0, 0, &tid);
        Sleep(10);
        }
        // Ждём, пока потоки не завершит свою работу
    WaitForMultipleObjects(4, Thread, TRUE, INFINITE );
        cout<<"Потоки завершили работу"<<endl;
        for (i=0;i<8;i++){
        CloseHandle(Thread[i]);
        }
        k=0;
        for (i=0;i<2;i++){
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum2, 0, 0, &tid);
        Sleep(10);
        }
       // Ждём, пока потоки не завершит свою работу
    WaitForMultipleObjects(2, Thread, TRUE, INFINITE );
        cout<<"Потоки завершили работу"<<endl;
        for (i=0;i<2;i++){
        CloseHandle(Thread[i]);
        }
        //for (i=0;i<10;i++)cout<<mem[i]<<endl;
        p=4;k=0;i=0;
        Thread[1] = (HANDLE)_beginthreadex(NULL, 0, Sum2, 0, 0, &tid);
        Sleep(10);
        cout<<"Потоки завершили работу"<<endl;
        CloseHandle(Thread[1]);
 
        getch();
    return 0;
}
Но не как не могу понять некоторых вещей:

1. HANDLE Thread[8]; - Что такое HANDLE? Это тип данных или что? Thread[8] - это я так понимаю массив из 8 элементов типа HANDLE?
2. DWORD res; - что это такое?
3. Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum, 0, 0, &tid); Sleep(10); Как понять эту строчку?
4. WaitForMultipleObjects(4, Thread, TRUE, INFINITE ); Как понять эту строчку?

Заранее благодарен за понимание, я новенький в этом деле, поэтому с чтением документации возникают проблемы. Нужна определённая база, чтобы понимать всё.
Поправьте если что не так говорю. Заранее благодарен!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2009, 22:09
Ответы с готовыми решениями:

Как создать дополнительный поток?
сабж. пробовал создавать так: void Thread( void* pParams ) { int i, num = 0; while ( 1 ) { Sleep(1000); ...

Как создать поток (Thread) в с++ mfc?
Здравствуйте!) Не могу ни как понять, как создать поток в с++ mfc? В c# и с++ делал потоки, но в mfc как-то по другому они чтоль...

Как создать виртуальный поток и переопределить оператор <<?
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный. Впрочем, создание сего не противоречит синтаксису. Вот,...

3
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.12.2009, 22:39
1. HANDLE - это описатель (дескриптор) объекта ядра "поток". Точно такой же хэндл, как, например, для файлов - возвращаемый функцией CreateFile. И точно так же подлежит закрытию, когда он тебе больше не нужен.
2. DWORD res; - объявление переменной res типа DWORD.
3. Функцией _beginthreadex запускается поток, а возвращенное значение, трактуемое как хэндл потока, заносится в массив хэндлов. Зачем там потом делается Sleep(10); - задержка на 10 мс - это хз, спроси у автора этого кода.
4. WaitForMultipleObjects - ожидаем завершения всех потоков (освобождения их хэндлов). Справку по функции WaitForMultipleObjects можно прочесть в MSDN.
1
 Аватар для nazavrik
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
12.12.2009, 02:16
Советую прочесть Дж.Рихтера. Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows. (в интернете есть в удобочитаемом формате) ГЛАВА 6 Базовые сведения о потоках.

Займет некоторое время, зато будешь разбираться в вопросе.
1
0 / 0 / 0
Регистрация: 08.12.2009
Сообщений: 5
12.12.2009, 13:43  [ТС]
nazavrik, Спасибо большое!! Обязательно прочту! Я искал литературу, нашел "Параллельное и распределённое программирование с использованием С++" Авторы: Трейси Хьюз и Камерон Хьюз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2009, 13:43
Помогаю со студенческими работами здесь

Как создать меню в mfc в msvs 2008?
может кто подскажет, как меню создать

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

Как создать поток?
В мсдн прочитав про потоки, написал следующую фигню: private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e)...

Как создать поток?
Как создать поток?

Как создать 2-ой поток?
Совсем не разбираюсь в многопоточных приложениях. Хочу чтобы при загрузке формы 1-ый поток занимался открытием и выполнением другой...


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

Или воспользуйтесь поиском по форуму:
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