Asher |
Отправлено: 16.10.2003, 10:56 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Создаю Thread через CreateThread
CODE |
HANDLE hTmrThread;
DWORD WINAPI TmrThreadFunc(LPVOID Sender)//
{ //Функция потока
return 0; //Выйти
} //TmrThreadFunc(LPVOID lpvoid)
hTmrThread = CreateThread(NULL, 0, TmrThreadFunc, (void*)this,
CREATE_SUSPENDED, lpdwTmrThreadID);//Создать поток
if (hTmrThread == NULL)//Если создать не удалось, то
CloseHandle(hTmrThread);
else
SetThreadPriority(hTmrThread, THREAD_PRIORITY_HIGHEST);
|
в W2K и XP все отлично.
В W98 hTmrThread при создании возвращает NULL. Читать MSDN уже устал.
Помогите!!! В чем грабли???
|
|
Георгий |
Отправлено: 16.10.2003, 21:28 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
А GetLastError что говорит?
из помощи BCB:
QUOTE | Windows 95: CreateThread succeeds only when it is called in the context of a 32-bit program. A 32-bit DLL cannot create an additional thread when that DLL is being called by a 16-bit program. |
Может в этом дело? |
|
Asher |
Отправлено: 17.10.2003, 08:29 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Подлый GetLastError говорит 0!!!
Один в один эта цитата есть и в MSDN. DLL у меня тут нет, 16-bit приложению тоже взяться неоткуда
|
|
Георгий |
Отправлено: 17.10.2003, 22:00 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
А попробуй мой проектик запустить — я на нём, как ты помнишь, игрался с много поточностью. А в нём кнопочка CreateThread и создаёт (что впрочем и видно по исходникам) потоки через Win32API. Если и оно работать не будет...
PS. после того, как на работе пересел на QNX, нужды дома держать весь зоопарк ОС (W98, w2000, wXP) от мелкомягких не стало. Причём, даже поиграться с W98 (95) не смогу в ближайшее время т.к. system commander не вовремя вспомнил, что он хочет лицензию и перестал реконфигурироваться
|
|
Asher |
Отправлено: 18.10.2003, 11:39 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Извините что не пишу все подробности сразу и этим затрудняю осмысление ситуации...
Я не тот человек, который сразу бежит спрашивать — так я ничего не достиг бы.
После того как чтение MSDN мне надоело, я вспомнил про этот пример, приводимый в сравнение CreateTread и TTread и скачал его. Результат точно такой-же, как и у меня.
если после строки HANDLE hThread; там содержится какой-то мусор (весьма странно — в NT семействе там NULL сразу), то после строки
hThread=CreateThread(NULL,0,ThreadFunc,&ThreadData[i],CREATE_SUSPENDED,0);
hThread все-таки становится в NULL
P.S. Для запуска Win98 на рабочей и домашней машине пользуюсь VMWare. Тормоз примерно в 4 раза, но современные машины позволяют это пережиить. Даже Com и LPT порты нормально работают. Проверял и на них, и на нормальных Win98 (в бухгалтерии )
Ау, люди!!! Попробуйте кто-нибудь этот пример под Win98, может это у меня в округе они какие-то неправильные MS Win98SE 4.10.2222A
Други версии найти не удается, вымерли. Старые диски растерялись...
Интересно — цифровая информация, CD... А археологи все равно наверное нас будут изучать по найденым материальным носителям (книги, фото, бумажные архивы, etc) Цифровое еще менее долговечно чем аналоговое! 451 по фаренгейту, блин
|
|
Георгий |
Отправлено: 18.10.2003, 14:25 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
А через TThread работает???
Рея Бредбери ты хорошо вспомнил...
Отредактировано Георгий — 18/10/2003, 15:27 |
|
Asher |
Отправлено: 18.10.2003, 15:26 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
TTread работает, но с ним есть две проблемы. Если внутри вызываемых функций елучается Exception, даже отлавливаемый, то поток иногда отправляется в Suspend и даже иногда из него по Resume не выходит.
Да и тормоз он
|
|
Asher |
Отправлено: 30.10.2003, 17:22 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Переставил Win98 и Builder. CreateTread не заработал, но GetLastError начал говорить 87 ("Параметр задан неверно")
P.S. Нахрена заказчику поддержка W98?
|
|
Asher |
Отправлено: 30.10.2003, 18:12 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Пошел монолог
Забил я его все-таки.
По описанию
CODE |
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);
|
Для Win95/98/Me параметр lpThreadId не должен быть NULL. Это я все делал, но реально работает только если
LPDWORD lpdwThreadID; //ID потока
hThread = CreateThread(NULL, 0, ThreadFunc, (void*)this,
CREATE_SUSPENDED, (LPDWORD)&lpdwThreadID);//создаем поток
"Правильная" конструкция (LPDWORD)&lpdwThreadID, где lpdwThreadID типа LPDWORD меня УДИВИЛА.
|
|
Георгий |
Отправлено: 30.10.2003, 21:33 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
Указатель на указатель, который указывает на ячейку памяти, куда записать идентификатор потока?
Над этим надо подумать ( "Третим будешь?" "Да." "Тогда найди второго!")
|
|