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


Гость






Цитата
Необходимо использовать какие-либо средства для синхронизации?
Необходимо запрещать доступ к файлу, в который пишется информация, одновременно нескольким потокам... Проще всего - реализовать через Event-ы: в начале работы программы создаешь событие, которое будет контролировать доступ к файлу результатов:

HANDLE myEvent; // в H-файле эта переменная описана через extern

int main(int argc, char *argv[])
{
DWORD id[10] = {0};
HANDLE TH[10] = {0};
clock_t tS, tE;

myEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Создаем событие,
SetEvent(myEvent); // и сразу же его устанавливаем, чтоб не держать потоки

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;
}

, а для того, чтобы гарантировать, что пока один поток пишет в файл, другой будет ждать освобождения файла, чуть-чуть меняешь функцию потока:
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();

WaitForSingleObject(myEvent, INFINITE); // если Event сброшен - ждать
SaveResults(PS, parsedst);
SetEvent(myEvent); // По окончании записи в файл разрешить записывать другим

return TRUE;
}
Вот и все, теперь информация от всех тредов будет сохранена...
 К началу страницы 
+ Ответить 

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


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

 





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