IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> CreateThread и _beginthreadex для gcc (minGw)
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Проблема вот в чем : в функциях win32api CreateThread и _beginthreadex как параметр функции-потока передается указатель на void. Для bcw 5.5 подойдет любой параметр,а вот gcc выдает ошибку о неправильном использовании void-параметра. Как обойти?переносить код на borland c++ 5.5 времени нет, да и исправлять всё там муторно.. в VS08 этот проект так же не переноситься..как быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Спасибо, volvo.. После этого поста, я думаю у тебя появиться желание меня убитьsmile.gif) Вообщем, код исходный :
main

#include "interface.h"

int main(int argc, char *argv[])
{
DWORD id[10];
HANDLE TH[10];
clock_t tS, tE;
std::vector<std::string> Paths;
tS=clock();
GetFileList(argv, Paths);
for (int i = 0; i < atoi(argv[2]); i++)
TH[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MainFunction,
&Paths[i], 0, &id[i]);
WaitForMultipleObjects(atoi(argv[2]), TH, TRUE, INFINITE);
tE=clock();
return 0;
}




interface.h

#include <algorithm>
#include <iostream.h>
#include <process.h>
#include <windows.h>
#include <fstream.h>
#include <string>
#include <vector.h>
std::string GetStringFromFile(std::string &fname);
void GetFileList(char *argv[], std::vector<std::string>& vect);// Получает список файлов по заданной маске
std::string Parser(std::string &s, char& devider);
unsigned int GetDividerCount(std::string &s, char& devider);
bool comp(std::string s1, std::string s2);
std::string NameGenerator(char *argv[]);
void SaveResults (std::vector<std::string> &PS,std::size_t &parsedst);//changed
bool MainFunction(std::string *v);



realiz.cpp

#include "interface.h"
std::string GetStringFromFile(std::string &fname)//changed
{
std::string xstr;
std::ifstream xfile;
xfile.open(fname.data(), std::ios::binary);
xfile.seekg(0, std::ios_base::end);
xstr.resize(xfile.tellg());
xfile.seekg(0, std::ios_base::beg);
//копируем данные
char mychar[xstr.size()];
xfile.read(mychar, xstr.size());
xfile.close();
xstr = mychar;
return xstr;
}

void GetFileList(char *argv[], std::vector<std::string>& vect)//not changed
{
WIN32_FIND_DATA dFile;
HANDLE hFile;
std::string path;

char s[MAX_PATH] = "";
lstrcpy(s, argv[1]);
path = s;
lstrcat(s, "\\*.txt");

path += "\\";
hFile = FindFirstFile(s, &dFile);
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
vect.push_back(path + dFile.cFileName);
} while (FindNextFile(hFile, &dFile) != 0);
FindClose(hFile);
}
}

unsigned int GetDividerCount(std::string &s, char& devider)//not changed
{
int count = 0;
for (unsigned int i = 0; i < s.size(); i++)
if (s.at(i) == devider)
count++;
return count;
}

std::string Parser(std::string &s, char& devider)//not changed
{
std::string bufs;
int n = s.find('.');
bufs.append(s, 0, n);
s.erase(0, n + 1);
return bufs;
}

bool comp(std::string s1, std::string s2)//not changed
{
return s1.size() > s2.size();
}

std::string NameGenerator(char *argv[])//not changed
{
std::string fname = "Result_____.txt";
SYSTEMTIME st;
GetSystemTime(&st);
fname.insert(7, argv[2]);
char ch[3];
itoa(st.wHour + 3, ch, 10);
if (fname.size() == 17)
fname.insert(10, ch);
else
fname.insert(9, ch);
itoa(st.wMinute, ch, 10);
if (fname.size() == 19)
fname.insert(13, ch);
else
fname.insert(12, ch);
itoa(st.wSecond, ch, 10);
if (fname.size() == 21)
fname.insert(16, ch);
else
fname.insert(15, ch);
return fname;
}

void SaveResults(std::vector<std::string> &PS, std::size_t &parsedst)//changed

{
ofstream outfile("result.txt", std::ios::app);
outfile << "\nFive longest strings for file " << " : \n";
for (unsigned int i = 0; i < 5; i++)
outfile << i + 1 << " - " << PS[i] << "\n";
outfile << "\nTotal count of parsed strings for this file : " << parsedst
<< "\n";
outfile.close();
}

bool MainFunction(std::string *v)
{
std::string String;//целая строка из файла
std::vector<std::string> PS;// вектор разбитых строк
char d = '.';//разделитель предложений
std::size_t parsedst = 0;//кол-во обработанных строк
unsigned int dcount = 0;//кол-во разделителей в файле определяет кол-во предложений в файле.
String = GetStringFromFile(*v);
dcount = GetDividerCount(String, d);
for (unsigned int j = 0; j < dcount; j++)
PS.push_back(Parser(String, d));
std::sort(PS.begin(), PS.end(), comp);
parsedst = PS.size();
SaveResults(PS, parsedst);
return TRUE;
}


Запускается через командную строку, ввиде : prog.exe *ПУТЬ к папке с файлами формата txt* *кол-во файлов для обработки*
Например C:\some\pr.exe C:\1 10.
Программа читает файлы и создает результирующий файл, в котором записываются 5 самых длинных предложений для каждого файла. Предложения разделяются символом "." .
Прикладываю архив с файлами для обработки.
Проблема вот в чем, я раньше выкладывал этот код для одно-потокового варианта, сейчас надо организовать многопоточностьsmile.gif. Основная проблема в том, что в результирующем файл записываются результаты не для всех файлов. В принципе, это наверное из-за асинхронизации процессов. Необходимо использовать какие-либо средства для синхронизации?Ну, допустим, мьютексы. Я прав? Если нет , то в чем ошибка?

Сообщение отредактировано: Andrewshkovskii -


Прикрепленные файлы
Прикрепленный файл  1.zip ( 1.19 килобайт ) Кол-во скачиваний: 218
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.05.2024 9:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name