![]() |
|
|
#1 (permalink) |
|
Child of Darkness
|
Delphi и потоки
Вообщем ситуация такая: есть dll в которую засунута форма, есть процедурка, которой передаются три параметра (InFile,OutFile: String; LevelArch: byte). Нужно сделат так чтобы когда запускается dll, из неё запускалась форма, на которойбудет двигаться анимашки через компонент TAnimate - с этим проблем нет. И так же запускался поток, который выполнялся бы параллельно той форме, которому передались бы параметры и он бы там уже делал действия, после выполнения их, мило уничтожился. Есть у кого-нить мысли как такое сделать. Всё ето нужно для того чтобы пока выполняется процедурка программа не подвисала, идеи с Application.ProcessMessages; не предлагать так как нет возможности её засунуть.
|
|
|
|
|
|
#2 (permalink) |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
А использовать CreateThread религия не позволяет?
|
|
|
|
|
|
#4 (permalink) |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
Пишешь функцию, которую хочешь выполнять параллельно, например foo(). Создаешь поток (тред, нитку, кому как нравится) через CreateThread(0, 0, foo, 0, 0, &id). Функция начинает выполняться. Более подробно - в MSDN.
|
|
|
|
|
|
#6 (permalink) |
|
Child of Darkness
|
Если эта функция, то CreateThread(0, 0, foo, 0, 0, &id) присваивать како-нить переменной, чтоб вернула значение?
С процедуркой также? &id - это что такое? |
|
|
|
|
|
#7 (permalink) |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
CreateThread возвращает хендл потока, с которым потом можно выполнять всякие нехорошие действия типа SuspendThread, ResumeThread или вообще TerminateThread. id - идентификатор потока, тебе он, в принципе, не нужен, но если его не принимать, то компилятор будет сердиться. Процедурка (foo) должна иметь определенный тип: DWORD WINAPI foo(LPVOID). Короче, RTFM MSDN!
![]() |
|
|
|
|
|
#8 (permalink) |
|
Child of Darkness
|
Мля, давай ещё проще, есть:
procedure CompressFile(const sFileIn : string; const sFileOut : string; const Level : TCompLevel = clDefault); вот её CompressFile(InFile,OutFile,Level); мне надо засунуть в поток, и тут же выполнить другое действие, не дожидаясь окончания выполнения етой процедуры. Я делаю CreateThread(0, 0, CompressFile(InFile,OutFile,Level), 0, 0, &id); После чего появляется ошибка при компиляции: Incompatible types: 'procedure, untyped pointer or untypes parameter' and 'Pointer' Как надо прописать процедурку и после етой строчки надо её как-то ещё отдельно запускать останавливать? P.S. С MSDN не дружу. |
|
|
|
|
|
#9 (permalink) |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
Во-первых, функция должна быть описана как DWORD WINAPI CompressFile(LPVOID). Во-вторых, в CreateThread тебе надо передать указатель на нее, т. е. просто CompressFile без скобочек!!! о чем тебе любезно написал компилятор. Все параметры функции надо объединить в структуру и ее адрес передавать в качестве параметра функции, например CreateThread(0, 0, CompressFile, (void*)&struct_name, 0, 0, &id). В-третих, без MSDN ты все равно это никогда не сделаешь, поэтому брось эту затею и ищи другой метод.
|
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | |
| Опции просмотра | |
|
|
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Delphi - Need help | MisterVic | Программирование | 3 | 16.08.2007 23:01 |