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


Гость






Цитата
как же я бы сам смог до такого дойти, с нашими институтскими методичками

У тебя ж выход в Сеть есть? А в MSDN явно сказано, что третий параметр у CreateThread Function имеет тип LPTHREAD_START_ROUTINE... А если компилятор не может привести типы сам, надо попытаться ему помочь, в большинстве случаев это срабатывает.

Цитата
почему же 4 вызова происходят в один момент времени, а последний, 5ый, можно сказать "после завершения программы"
То есть, ты на 100% уверен, что запаздывает именно пятый поток? smile.gif Мне очень жаль тебя огорчать, конечно, но это не так... Смотри:
#include <iostream>
#include <string>
#include <windows.h>

void prf( std::string fname)
{
std::cout << fname;
}

int main(int argc, char* argv[])
{
std::string fname="file";
HANDLE ITT[6];
DWORD ID;
for(int i=0;i<5;i++) {
std::string s = fname + (char)(i + '0');
ITT[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)prf,&s,0,&ID);
}

}

Так какой поток запаздывает, говоришь? smile.gif А все потому, что передал-то я адрес переменной, но чему она равна в тот момент, когда начинает работать поток, и существует ли она вообще? При всем этом я и получать должен адрес, а не что-то иное... Кстати, еще одно: поток не завершается потому, что для гарантированного завершения функция prf должна вернуть значение. У тебя это невозможно, поскольку описана функция как void, а ведь MSDN предупреждает:
Цитата
Do not declare this callback function with a void return type and cast the function pointer to LPTHREAD_START_ROUTINE when creating the thread. Code that does this is common, but it can crash on 64-bit Windows.
( отсюда: ThreadProc Callback Function )

Вот так надо было делать, чтобы правильно отработали все потоки:
#include <iostream>
#include <string>
#include <windows.h>

DWORD prf(std::string *s)
{
std::cout << *s << std::endl;
return 0;
}


int main(int argc, char* argv[])
{
std::string fname="file";
HANDLE ITT[5]; // Зачем у тебя здесь было 6?

std::string strs[5]; // !!!
DWORD ID;
for(int i=0;i<5;i++) {
strs[i] = fname + (char)(i + '0'); // !!!
ITT[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)prf,&strs[i],0,&ID);
}
WaitForMultipleObjects(5, ITT, TRUE, INFINITE); // ждем завершения всех потоков
return 0;
}
 К началу страницы 
+ Ответить 

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


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

 





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