![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Andrewshkovskii |
![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Проблема вот в чем : в функциях win32api CreateThread и _beginthreadex как параметр функции-потока передается указатель на void. Для bcw 5.5 подойдет любой параметр,а вот gcc выдает ошибку о неправильном использовании void-параметра. Как обойти?переносить код на borland c++ 5.5 времени нет, да и исправлять всё там муторно.. в VS08 этот проект так же не переноситься..как быть?
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Показывай описание функции потока, и то, как ты пытаешься вызвать CreateThread
Сообщение отредактировано: volvo - 30.11.2008 14:33 |
Andrewshkovskii |
![]()
Сообщение
#3
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
ну, допустим, вот пример простой :
#include <iostream> Ошибки : initializing argument 3 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)' invalid conversion from `void (*)(int)' to `DWORD (*)(void*)' |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Ну, вот тебе пример вызова, который компилируется без ошибок:
#include <iostream> Вопрос в том, будет ли он правильно работать. Все-таки ты должен был делать void prf(int* i), требуется же указатель, а не что-то другое... |
Andrewshkovskii |
![]()
Сообщение
#5
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
с этим понятно. Интересно, как же я бы сам смог до такого дойти, с нашими институтскими методичками.Спасибо большое. Только теперь другой вопрос :
вот такой вот код :
Куда проподает последний вызов?Точнее нет, он не проподает, я знаю. (если в конце поставить 2 cin.get(), то его можно увидеть после считывания символов), но все же, почему же 4 вызова происходят в один момент времени, а последний, 5ый, можно сказать "после завершения программы". Кстате, если использовать параметр функции потока как std::string* то вообще ничего не происходит. volvo, пожалуйста, разъясни ситиацию, я уже совсем ничего не понимаю. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата как же я бы сам смог до такого дойти, с нашими институтскими методичками У тебя ж выход в Сеть есть? А в MSDN явно сказано, что третий параметр у CreateThread Function имеет тип LPTHREAD_START_ROUTINE... А если компилятор не может привести типы сам, надо попытаться ему помочь, в большинстве случаев это срабатывает. Цитата почему же 4 вызова происходят в один момент времени, а последний, 5ый, можно сказать "после завершения программы" То есть, ты на 100% уверен, что запаздывает именно пятый поток? ![]() #include <iostream>Так какой поток запаздывает, говоришь? ![]() Цитата 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> |
Andrewshkovskii |
![]()
Сообщение
#7
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Спасибо, volvo.. После этого поста, я думаю у тебя появиться желание меня убить
![]() main
interface.h
realiz.cpp
Запускается через командную строку, ввиде : prog.exe *ПУТЬ к папке с файлами формата txt* *кол-во файлов для обработки* Например C:\some\pr.exe C:\1 10. Программа читает файлы и создает результирующий файл, в котором записываются 5 самых длинных предложений для каждого файла. Предложения разделяются символом "." . Прикладываю архив с файлами для обработки. Проблема вот в чем, я раньше выкладывал этот код для одно-потокового варианта, сейчас надо организовать многопоточность ![]() Сообщение отредактировано: Andrewshkovskii - 5.12.2008 1:02 Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата Необходимо использовать какие-либо средства для синхронизации? Необходимо запрещать доступ к файлу, в который пишется информация, одновременно нескольким потокам... Проще всего - реализовать через Event-ы: в начале работы программы создаешь событие, которое будет контролировать доступ к файлу результатов:HANDLE myEvent; // в H-файле эта переменная описана через extern, а для того, чтобы гарантировать, что пока один поток пишет в файл, другой будет ждать освобождения файла, чуть-чуть меняешь функцию потока: bool MainFunction(std::string *v)Вот и все, теперь информация от всех тредов будет сохранена... |
Andrewshkovskii |
![]()
Сообщение
#9
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Внимание, вопрос :
SetEvent(myEvent); // и сразу же его устанавливаем, чтоб не держать потоки Время исполнения не изменяется в лучшую сторону, а иногда даже ухудщается.. вот файл с тестами. A - вариант с однопоточным. B - вариант с многопоточным. C - вариант с изменением приоритетов. h - чтение с hdd f - с flash. Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Время исполнения не изменяется в лучшую сторону, а иногда даже ухудщается.. Во-первых, как ты замерял время?Во-вторых, кто тебе сказал, что при при изменении приоритета потока это изменение вообще влияет на скорость выполнения данного потока? Ну, допустим, у тебя поток теперь имеет THREAD_PRIORITY_HIGHEST. А сам процесс твой с каким приоритетом работает? Дальше: ты работаешь с диском, а это уже медленно, имеет ли смысл повышать приоритет, чтоб работать с медленными устройствами? Кроме всего прочего, Windows сама прекрасно может динамически менять приоритет твоего потока (что может отрицательно сказаться на быстродействии приложения, были жалобы, об этом есть у Рихтера), именно по этой причине есть функции SetProcessPriorityBoost / SetThreadPriorityBoost Ну, и напоследок... Если уж ты действительно хочешь попробовать изменить приоритет потока, то создавай поток "спящим", потом меняй приоритет, и потом "буди" поток, так будет лучше. |
Andrewshkovskii |
![]()
Сообщение
#11
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
1 . Мне по заданию надо использовать функцию повышения приоритета , добившись тем самым , как написано " Заметного прироста скорости работы".
2 . Замеряю так :
3. процесс работает с нормальным приоритетом . т.е normal class. Насчет создания спящем..сейчас попробую Сообщение отредактировано: Andrewshkovskii - 8.12.2008 19:56 |
![]() ![]() |
![]() |
Текстовая версия | 14.08.2025 9:45 |