Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 15:53   #1
Equive
Новичок
Джуниор
 
Регистрация: 27.02.2011
Сообщений: 2
По умолчанию Потоки win api

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

Такое задание: необходимо написать программу, которая в главном потоке создает дополнительный поток, и уже в нем производятся вычисления, причем главный поток продолжает обрабатывать пользовательский ввод.
Я что-то написал, но возникает проблема. Например, поток приостанавливается не всегда, и программа не всегда реагирует на пользовательский ввод.
Помогите, пожалуйста, определить что не так. Заранее извиниюсь за некоторую корявость программы, я только учусь =)
Код:
#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;
}
Спасибо.

Последний раз редактировалось Stilet; 10.04.2011 в 16:35.
Equive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win API ( CИ) ПроГрам Помощь студентам 0 29.04.2010 21:43
Win API рисование Granus Win Api 11 29.06.2009 13:20
Win Api alexov Общие вопросы C/C++ 4 29.01.2009 13:33
Win API aleks_n Общие вопросы Delphi 0 15.09.2008 11:07