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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2011, 21:02   #1
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию Порт задачи под Linux (С++)

Добрый вечер. Нужно портировать задачу под Linux, а я Linux даже в глаза не видел, не то чтобы порты писать Половина функций в моей задаче не работает по причине присутствия Windows.h, а их аналогов я не могу найти.
Вот код:
Код:
#include <iostream>
#include <fstream>
#include <cmath>
#include <windows.h> 
#define NUM_THREADS 4		//количество потоков, проверяющих числа на простоту
using namespace std;

struct PARAMS				//параметры передаваемые потоку
{
	int beg_index;			//начальный индекс для проверки
	int num;				//количество проверяемых значений
};

bool suspend=false;

int maxnum;					//Количество элементов
int calculated=0;			//Количество проверенных чисел


PARAMS params[NUM_THREADS];	//массив параметров, передаваемых потокам
HANDLE threads[NUM_THREADS+1];	//Массив потоков программы
HANDLE hStdOut;				//дескриптор консоли

CRITICAL_SECTION cs,cs1;
fstream *fs;

//Проверка числа на простоту
bool isprost(int a)
{
	int i,sq=(int)sqrt((double)a);	//Квадратный корень из числа
	if(a<2)return false;					//Если число меньше 2 - не простое
	for(i=2;i<=sq;i++) if(a%i==0) break;	//проверка делителей от 2 до корня из числа
	if(i==sq+1) return true;				//Если ни один делитель не найден - число простое
	else return false;
}

//Поток вывода прогресса
DWORD percentage(LPVOID lpv)
{
	CONSOLE_SCREEN_BUFFER_INFO ci;
	int perc;
	static SHORT lastspace=!!(GetKeyState(VK_SPACE)&0x80);
	static SHORT lastesc=!!(GetKeyState(VK_ESCAPE)&0x80);

	SHORT space,esc;

	while((perc=100*calculated/maxnum)<100)		//Вывод пока сделана меньше 100%
	{
		GetConsoleScreenBufferInfo(hStdOut,&ci);	//Получение информации о консоли
		ci.dwCursorPosition.X=0;					
		SetConsoleCursorPosition(hStdOut,ci.dwCursorPosition);	//Перемещение курсора в начало строки
		for(int i=0;i<perc/2;i++) cout << 'X';			//Вывод прогресса
		cout << " " << perc << '%';						// проценты
    	space=!!(GetKeyState(VK_SPACE)&0x80);
    	esc=!!(GetKeyState(VK_ESCAPE)&0x80);
		if(esc)
		{
 			for(int i=0;i<NUM_THREADS;i++)
			{
				if(suspend)
				{
					ResumeThread(threads[i]);
					Sleep(100);
				}
				TerminateThread(threads[i],0);
			}
			ExitThread(0);
		}
		if(space&&space!=lastspace&&!suspend)
		{
 			for(int i=0;i<NUM_THREADS;i++)
			{
				SuspendThread(threads[i]);
			}
			suspend=true;
		}
		else if(space&&space!=lastspace&&suspend)
		{
 			for(int i=0;i<NUM_THREADS;i++)
			{
				ResumeThread(threads[i]);
			}
			suspend=false;
		}
		lastspace=space;
		Sleep(100);										
	}
	//Вывод окончательного прогресса.
	GetConsoleScreenBufferInfo(hStdOut,&ci);
	ci.dwCursorPosition.X=0;
	SetConsoleCursorPosition(hStdOut,ci.dwCursorPosition);
	for(int i=0;i<perc/2;i++) cout << 'X';
	cout << " " << perc << '%';
	return 0;
}

//Поток проверки чисел на простоту
VOID WINAPI check( PARAMS *lpv)
{
	int i;
	//Проверить выделенное потоку количество чисел
	for(i=lpv->beg_index;i<lpv->beg_index+lpv->num;i++)
	{
		if(isprost(i))
		{
			EnterCriticalSection(&cs);
			*fs << i << endl;
			LeaveCriticalSection(&cs);
		}
			EnterCriticalSection(&cs1);
			calculated++;		
			LeaveCriticalSection(&cs1);
	}
	ExitThread(0);
}



int main(int argc, char *argv[])
{
	DWORD th;
	setlocale(LC_ALL,"Russian");//русская локаль
	hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);		//получить дескриптор консоли
	cout << "Введите значение: ";
	cin >> maxnum;
    if (maxnum<NUM_THREADS)
    {
		cout << "Количество элементов меньше, чем количество потоков" << endl;
		system("pause");
		return 1;
	}	
	fs=new fstream("simple.txt",ios::out);

	InitializeCriticalSection(&cs);
	InitializeCriticalSection(&cs1);
	cout << "Пробел - пауза/запуск, Esc - конец" << endl;
	for(int i=0;i<NUM_THREADS;i++)	//раскидывание диапазонов чисел для проверки по потокам
	{
		//каждому потоку дается равное количество чисел для проверки
		params[i].beg_index=i*(maxnum/NUM_THREADS);
		if(i==NUM_THREADS-1)
		{
			params[i].num=maxnum-params[i].beg_index;	//Если количество потоков не кратно количеству чисел, 
                      //числа раскидываются поровну, а последнему потоку что осталось
		}
		else
		{
			params[i].num=maxnum/NUM_THREADS;			//делим поровну
		}
		threads[i]=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)check,&params[i],CREATE_SUSPENDED|THREAD_ALL_ACCESS,&th);
		ResumeThread(threads[i]);
	}
	percentage(0);
	WaitForMultipleObjects(NUM_THREADS+1,threads,TRUE,INFINITE);	//Ожидание окончания всех потоков
	DeleteCriticalSection(&cs);
	DeleteCriticalSection(&cs1);
	cout << endl;
	fs->close();
	cout << "Сформирован файл simple.txt" << endl;
	system("pause");
	return 0;
}
Преподаватель сказал использовать pthread.h
Я смог только заменить критические секции на мьютексы и CreateThread на pthread_create

Последний раз редактировалось Brabus; 18.10.2011 в 21:05.
Brabus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IDE под linux krotFT Софт 12 25.01.2011 05:40
Программирование под Linux ji_ji Lazarus, Free Pascal, CodeTyphon 4 12.07.2010 14:00
Лаба под Linux bymer Помощь студентам 0 29.09.2009 19:41
Отправка данных в СОМ порт из под VBA Excel Abhcn Microsoft Office Excel 3 03.03.2009 23:56