Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
#1

Потоки win api - C++

10.04.2011, 15:50. Просмотров 1907. Ответов 19
Метки нет (Все метки)

Здравствуйте.

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

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
#include <iostream>  
#include <clocale>
#include <fstream>  
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
 
using namespace std;
 
const int n=100000;  
int k=0;  
float arr[n];  
float arr1[n];
bool Pause=false;
bool Stop=false;
DWORD code;
HANDLE MainThread;
HANDLE hThread;
DWORD ThreadId;
 
int Num=0;
int Num1=0;
int t;
 
void Sorting (float* array, int left, int right)
{
// функция сортировки   
}
 
ofstream fout("output.txt");
 
DWORD WINAPI Output( LPVOID Param ) 
{ 
    int l=0, r=k-1; 
    Num=0;
    Sorting (arr, l, r);
    for (int i=0; i<k; ++i) 
    {
        fout<<arr[i]<<"   ";
    }
    cout<<"Сортировка завершена";
    return 0;
}
 
int main()
{
MainThread=GetCurrentThread();
setlocale (LC_ALL, "Russian");
 
ifstream fin("data.txt");
if (!fin)
{
    cout<<"Ошибка открытия файла.\n";
    return 1;
}
 
for (int i=0; i<n; ++i)
{
    if (!fin.eof()) 
    {
        fin>>arr[i]; 
        ++k;
    }
    else continue;  
}
 
for (int i=0; i<k; ++i)
{
    arr1[i]=arr[i];
}
 
hThread = CreateThread( NULL, 0, Output, NULL, CREATE_SUSPENDED, &ThreadId );
cout<<"- Для запуска потока сортировки введите 1\n- Для завершения работы потока введите 2\n- Для приостановления работы потока введите 3\n- Для возобновления работы потока введите 4\n";
 
GetExitCodeThread(hThread, &code);
 
while (code==STILL_ACTIVE)
{
    t=getch();
    GetExitCodeThread(hThread, &code);
 
    switch (t)
    {
    case 49: 
        cout<<"\nПоток запущен\n";
        ResumeThread(hThread);
 
        break;
    case 50:
        cout<<"\nРабота потока завершена\n";
        TerminateThread(hThread, STILL_ACTIVE);
        code=0;
        break;
    case 51:
        if (Pause==false)
        {
            cout<<"\nРабота потока приостановлена\n";
            SuspendThread (hThread);
            Pause=true;
        }
        break;
    case 52:
        if (Pause==true)
        {
            cout<<"\nРабота потока возобновлена\n";
            ResumeThread(hThread);
            Pause=false;
        }
        break;
    }
}
 
CloseHandle(hThread);
CloseHandle(MainThread);
 
return 0;
}
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 15:50     Потоки win api
Посмотрите здесь:

WIN API - C++
Доброе время суток. Учусь в институте и дали сделать такую хрень: Реализовать приложения Win32API: 1. Окно в центре экрана с фоном...

WIN API, кодировка - C++
Доброго времени суток! Вот если написать: MessageBox(NULL,(LPCWSTR) &quot;Тест&quot;,(LPCWSTR)&quot;Системное сообщение&quot;, MB_OK); выведется...

Преимущество Win Api - C++
Буквально вчера создал тему, где задал вопрос о средствах, с помощью которых можно работать некоторым образом в командной строке. Нашлось...

Построение графика в Win Api - C++
Требуется построить график по точкам. Все координаты даны. Не могу найти в пространстве интернета, с помощью каких функций это можно...

DrawText win api - Мистика =) - C++
Начинал изучать C++ на FreeBSD, собирал мейкфайлы и горя не знал. Полез в винде разбираться с её API, и начался дурдом. Вот код. Интересует...

win api точки входа - C++
меня интересуют названия функция получения точки входа файла получения конца файла (feof не подойдёт) и функция изменения точки входа. ...

Копирование файлов без win api - C++
Добрый день. Что прошу: Мне нужно выполнить копирование моего (ехе) в определенные директории - папки. Мне подсказали что можно...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 17:35     Потоки win api #2
Вроде всё нормально. Поподробнее опиши где споткнулся.

Добавлено через 6 минут
Кстати, оба потока у тебя выполняются одновременно, что тебе и надо было.
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 18:30  [ТС]     Потоки win api #3
Все нормально запускается в консоли, появляется меню, выбираю "запустить поток", запускается, что-то вычитсляет, потом нажимаю "приостановить поток",он приостанавливается. Но после этого если нажать, например, "возобновить поток", то ничего не происходит. То есть, как я понимаю, выполняется функция SuspendThread, а после нее почему-то больше ничего не выполняется.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 19:19     Потоки win api #4
Не знаю чего и как, но вот здесь Написано, что когда функция потока возвращает управление, поток умирает

В нашем случае после того, как ты увидел надпись "сортировка завершена", то всё, после этого return 0;
и поток умер, так что после этого ни приостановления ни, естественно возобновления потока не происходит- его просто нет. Дополнительно можешь в этом убедиться, проверив значение code в разных точках проги.
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 19:33  [ТС]     Потоки win api #5
Так ведь функция потока еще не завершилась, когда поток был приостановлен. Я уже пыталась проверить code послевыполнения функции SuspendThread, но на консоль после нее ничего не выводится. Прорамма как будто просто останавливается на этой строчке. Интересно, что неслько раз до этого она вполне корректно работала.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 19:46     Потоки win api #6
Цитата Сообщение от Equive Посмотреть сообщение
Так ведь функция потока еще не завершилась, когда поток был приостановлен.
не понял


Создаётся поток и запускается функция потока. СРАЗУ ЖЕ поток приостанавливается (фактически в момент запуска)

После чего жмём на цифру 1
После этого поток возобновляется, возобновляется и работа функции потока.

После чего мы видим на экране строчку
"сортировка завершена"

После чего делаем вывод, что поток убит.
Что вызывает сомнения?
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 19:54  [ТС]     Потоки win api #7
Поток можно еще раз приостановить до того, как "сортировка завершена" (если нажать на "3"). Тогда этот поток по идее должен приостановиться, управление передается главному потоку, который должен продолжать обрабатывать пользовательский ввод, но он его не обрабатывает. Ведь code=0 только когда либо функция потока завершилась сама, либо когда поток завершен функцией, а тут он еще не долже завершиться. То есть проблема, получается, даже не во втором потоке, а в главном что ли.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 20:19     Потоки win api #8
Мне тяжело так. Давай тезисно. Чё в моей писанине не так?
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 20:39  [ТС]     Потоки win api #9
Да в писанине все верно. Создаётся поток и запускается функция потока. Он сразу же приостанавливается. Затем нажимаем "1", поток и его функция возобновляются. Сам поток (сортировка) выполняется около минуты (большое количество чисел сортируется). Во время его работы можно нажать "3". Тогда вызывается функция, которая приостанавливает выполнение этого потока (поток не завершается, а только приостанавливается, и сортировка еще не завершена). Теоретически, если после этого возобновить выполнение потока, то соответственно он должен продолжить работу. Но после вызова функции приостановления (SuspendThread) перестает обрабатываться ввод, контролируемый главным потоком. То есть я после "3" нажимаю "4", должна сработать функция getch(), но ничего не происходит. Даже если сразу после SuspendThread прописываю в коде что-то вывести на консоль, то ничего не выводится.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 20:45     Потоки win api #10
Чё вы мне голову морочите? Дайте мне это самое большое количество чисел и напишите функцию сортировки!
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 21:00  [ТС]     Потоки win api #11
Вот функция сортировки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Sorting (float* array, int left, int right)
{
    int i=left, j=right;
    float middle=array[(left+right)/2];
    float temp;
    while (i<j)
    {
        while (array[i]<middle) i++; 
        while (middle<array[j]) j--; 
        if (i<=j)
        {
            temp=array[i]; array[i]=array[j]; array[j]=temp;
            i++; j--; 
        }
    }
    if (left<j) Sorting (array, left, j);
    if (i<right) Sorting (array, i, right); 
}
И файл с числами:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 21:05     Потоки win api #12
Ну где файл-то?
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 21:08  [ТС]     Потоки win api #13
Прошу прощения )
Вложения
Тип файла: txt data.txt (15.5 Кб, 16 просмотров)
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 21:13     Потоки win api #14
Блин я только нажимаю на 1, сразу практически отсортировывается, даже не успеть остановить поток!
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 21:26  [ТС]     Потоки win api #15
Вот файл побольше
Вложения
Тип файла: rar in.rar (513.5 Кб, 11 просмотров)
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 21:45     Потоки win api #16
В общем, у меня всё нормально.Чё у тебя за машина?
Сортирует примерно за 1-2 секунды

...Жму на 1, потом ТУТ ЖЕ на 3, всё предсказуемо:

Bash
1
2
Поток запущен
Работа потока приостановлена
Потом возобновляю, нажимаю то есть на 4 (у тебя не получалось), вижу

Bash
1
Работа потока возобновлена
через секунду

Bash
1
Сортировка завершена

Жму на 2, выхожу из проги, лезу в output.txt- так и есть, всё отсортировано
Грешу на машину твою, с такой скоростью... Может, просто надо подольше подождать?
Если уж тот маленький файл у тебя около минуты обрабатывался, чё уж об этом-то говорить!
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 21:49  [ТС]     Потоки win api #17
Мистика какая-то ) у меня поначалу тоже работало, а потом вот так... Может, и правда проблема в компьютере.
Спасибо Вам большое, очень помогли )
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 21:50     Потоки win api #18
Так слушай, ты давай-ка маленький файл сделай, примерно за секунду чтобы сортировалось и пробуй.
Equive
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 11
10.04.2011, 22:08  [ТС]     Потоки win api #19
Вы были правы ) теперь заработало ))
Огромное Вам спасибо! Это ж надо, как все просто решалось ) спасибо еще раз )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 22:12     Потоки win api
Еще ссылки по теме:

Win Api ошибка undefined reference to - C++
пишу функцию BOOL OnCreate(HWND hwnd,LPCREATESTRUCT) { HDC hdc; hBitmap=(HBITMAP)LoadImage(NULL, &quot;IMG.bmp&quot;,IMAGE_BITMAP, 0,...

Глобальное считывание комбинаций win api - C++
Всем привет, есть такая штука как autoHotKey смысл ее действия это считывать нажатия клавиш или комбо, и запускать определенные действия...

win API:найти информацию о логических дисках. - C++
Определить типы логических дисков, обьём диска, колличество секторов в клястере, тип драйвера.

Win api GetDlgItemInt что за второй параметр - C++
второй параметр функции UINT WINAPI GetDlgItemInt( _In_ HWND hDlg, _In_ int nIDDlgItem, _Out_opt_ BOOL...

Много ли времени нужно для изучения win api? - C++
Интересует данный вопрос, также хотел еще спросить: сложный ли он (win api)?


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
10.04.2011, 22:12     Потоки win api #20
приходи ещё
Yandex
Объявления
10.04.2011, 22:12     Потоки win api
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru