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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2010, 20:44   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Сортировка использую события

Добрый вечер нужно написать программу:выполняющую сортировку массива из n вещественных чисел методом обмена. Каждый проход сортировки запустить в отдельном потоке. Поток следующего прохода активизировать только тогда, когда предыдущий проход обработал половину массива.
Вот что написала
Код:
//сортировка массива из n элементов методом обмена	


#include "stdafx.h"
#include "windows.h"
#include "iostream"

//=============================================================================================================
//		описание данных
//=============================================================================================================
	const int n=5;	//размерность массива
	HANDLE hEventEnter;	//событие
	int arr[n];	//массив который нужно отсортировать
	int col_num[n-1];	//массив шагов

void print_arr(int mas[n])	//процедура печати массива
{
	for(int i=0;i<n;i++)
		std::cout<<mas[i]<<" ";
	std::cout<<"\n"; 
}

DWORD WINAPI sort_arr(void* data)	//функция сортировки столбцов матрицы методом обмена(номер столбца)
{
	int *pcol = (int*)data;
	int col=*pcol;

	WaitForSingleObject(hEventEnter,INFINITE);
	        
	for (int j=col; j>=0; j--)
	{
		if ((n/2+1)==j)
			ResetEvent(hEventEnter);
        if (arr[j] > arr[j+1]) 
		{
			int temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;
		}
	}
	return 0;
}



//=============================================================================================================
//			главная программа
//=============================================================================================================
void main()
{
	hEventEnter = CreateEvent(NULL,true,true,NULL);	//событие произошло

//=============================================================================================================
//			заполениние массивов
//=============================================================================================================
	for(int i=0;i<n;i++)
		arr[i]=(float)(rand()%20);
	
	print_arr(arr);

	for(int i=0;i<n-1;i++)
		col_num[i]=i;

//=============================================================================================================
//			создание потоков и сортировка
//=============================================================================================================
	HANDLE hThread[n-1];
	DWORD id[n-1];

	for(int i=0;i<n-1;i++)
	{
		hThread[i]=CreateThread(NULL,0,sort_arr,&col_num[i],0,&id[i]);
		if (hThread[i]==NULL)
		{	
			std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
		}
	}

	WaitForMultipleObjects(n-1,hThread,true,INFINITE);
	for(int i=0;i<n-1;i++)
		CloseHandle(hThread[i]);

	CloseHandle(hEventEnter);
	print_arr(arr);
	getchar();

}
Только она не всегда отрабаотывает корректно, посмотрите пожалуйста, что не так делаю
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить файл в пост-запрос, не использую TidMultiPartFormDataStream? TwiX Работа с сетью в Delphi 1 02.05.2010 21:41
Можно ли не создавая TStringList (использую with...do), использовать его в процедуре? TwiX Общие вопросы Delphi 8 17.03.2010 18:17
не получается связать две формы использую с++ в проекте Windows Application Form (не MFC) VS2008 molodoy-pirat Windows Forms 2 23.04.2009 10:27
Создать маленький архив использую API Никки Win Api 3 08.02.2009 00:40