Как прервать выполнение функции?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Как прервать выполнение функции?

Сообщение Glyckmen » 09.06.2006 (Пт) 12:06

Во время выполнении функции от DLL мне надо в некоторых случаях досрочно завершить выполнение этой функции и закрыть форму с которой она вызывалась, могу во время выполнения этой функции обрабатывать события формы и кнопок на ней, но при простом закрытии формы Unload Me функция все равно продолжает выполняться и подвешивает основную часть программы (пока функция не завершиться).

Можно-ли не создавая потоков и фиберов (потоки и фиберы пока сложноваты для меня, не тот уровень) остановить выполнение функции?
Последний раз редактировалось Glyckmen 10.06.2006 (Сб) 9:53, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.06.2006 (Пт) 12:13

См. http://bbs.vbstreets.ru/viewtopic.php?t=25514 и далее по ссылкам.
Изображение

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.06.2006 (Сб) 9:54

Я в первом посте вопрос поставил по другому!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.06.2006 (Сб) 10:01

В данной формулировке при условии, что функция в DLL остается неизменной проблема похоже не решаема.
Весь мир матрица, а мы в нем потоки байтов!

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.06.2006 (Сб) 10:16

!Viper!А вообще существует ли возможность чтобы после вызова, во время выполнения функции DLL, передать ей еще параметры , например на прекращение работы. Просто у меня есть связь с автором этой библиотеки и если такая возможность существует то как ее лутше реализовать, что-бы я потом смог это объяснить как это можно сделать автору библиотеки.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.06.2006 (Сб) 10:21

Код: Выделить всё
function   (..., byref stop as boolean) as long

Код: Выделить всё
dim f as boolean

call Function( ... , f)

Код: Выделить всё
f = true
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.06.2006 (Сб) 10:23

Вариант. Длительная функция периодически (допустим через заданное количество шагов) проверяет значение переменной-флага. Если значение этой переменной равно допустим True, то выполнение прекращается. Соответственно должна быть возможность обеспечить изменение этой переменной.
Весь мир матрица, а мы в нем потоки байтов!

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.06.2006 (Сб) 10:43

GSerg Если я правильно понял то:
Код: Выделить всё
function   (..., byref stop as boolean) as long
относится к библиотеке и должно там находиться (я думаю что автор сможет перевести это на DELPHI).

Код: Выделить всё
dim f as boolean
call Function( ... , f)
с этим все понятно

Код: Выделить всё
f = true
а эту переменную в моей программе функция сможет отслеживать, если она изменится в программе, то она так-же изменится и во время выполнения функции (остается в функцию включить периодическую проверку и If stop=True Then Exit Function).
Если все правильно то спасибо!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2006 (Сб) 10:57

И всё равно дельфийский автор вынужден будет запихнуть свою функцию в отдельный поток.
Иначе у тебя не будет шанса установить f до тех пор, пока функция не вернётся.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.06.2006 (Сб) 11:03

Из
Glyckmen писал(а):могу во время выполнения этой функции обрабатывать события формы и кнопок на ней
следует, что так оно и есть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2006 (Сб) 11:07

Вообще-то нет: вдруг она свой message pump гоняет?
Но, пожалуй, этого достаточно.
Изображение

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 10.06.2006 (Сб) 11:41

Я в другой теме писал об этой DLL и там у меня была проблема об извлечении данных из lParam (решенная с Вашей помощью), я просто перехватываю сообщения от DLL для организации ProgressBar и для вывода на форму другой служебной информации (прошедшее время, оставшееся время, сколько обработано), так-же поэксперементировал с кнопкой на форме и ее события так-же обрабатываются, в это время и можно поменять значение переменной-флага (но для этого как я уже говорил мне пришлось использовать SetWindowLong) поэтому я не знаю использует эта DLL потоки или нет но одназначно при ее простом выполнении (без перехватов) она программу замораживает. Вот поэтому и спрашиваю при таком способе (обработка переменной-флага для завершения работы функции) все сработает или нет.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 15.06.2006 (Чт) 14:30

Почему-то идея с переменной флагом не сработала (а может что-то не так сделали). Автор библиотеки любезно согласился ее подправить и ввел еще один параметр который то-же задается по сылке (вроде как аналог ByRef),и проверку организовал (перед отправкой сообщения), но не работает. Я свое значение меняю, на форме отображаю, но функция своей работы не прекращает. Объясните по подробней что передает ByRef в DLL адрес переменной или что-то другое?
Как можно получить физический адрес переменной?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.06.2006 (Чт) 14:45

Да, адрес. Но не физический.
Физический адрес переменной ты никак не получишь, а если бы и получил, то что бы делал с ним дальше?
Изображение

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 15.06.2006 (Чт) 14:58

tyomitchЗасунул бы его в переменную и отправил бы в функцию при вызове, а в функции уже бы по этому физ. адресу бралось его значение. Может между VB и DELPHI нет согласия и они исползуют разные адреса(если такое вообще возможно).
PS. Еще имеются соображения что здесь идет несогласованность в типе Boolean на DELPHI False=0, True=1 и в VB6 где False=0, а True=(по моему -1). Чему равно True в VB6?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.06.2006 (Чт) 14:59

Физические адреса не используются ни в VB, ни в делфях.

ByRef передаёт именно тот адрес, который дельфийская прога рассчитывает получить.

True = -1
Изображение

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 15.06.2006 (Чт) 15:20

Наверно в этом типе Boolean и идет несогласованность.
Если будут еще вопросы то обращусь.
Спасибо!

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 16.06.2006 (Пт) 11:45

Вопросы дальше! :roll:
У нас с автором библиотеки все равно не получается, наверно это с его стороны траблы (при изменении переменной-флага библиотека продолжает работать и в конце зависает, если флаг не изменять то все завершается по окончании штатно). Вопрос в другом, есть функция VarPtr (Ptr as Any) которая возвращает указатель на адрес переменной, а можно-ли получить по этому указателю значение. т.е. я не знаю ни имени переменной ни значение,но знаю что тип Long и имею указатель который мне передали, как по этому указателю взять значение?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 12:11

так ведь ты передаёшь указатель, а не получаешь?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.06.2006 (Пт) 12:25

tyomitch, человку имхо просто интересно как это сделать.

Наверное CopyMemory где src as any указать byval lPtr as long

поправьте если что не так.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 16.06.2006 (Пт) 13:43

Хакер Опять эта CopyMemory прям без нее никуда. :lol:
Все отлично работает, спасибо.:thumleft:

tyomitch Для того что-бы что-то рекомендовать другим надо самому это изучить, вот и хочу что-бы я знал как это реализовать хотя-бы на VB, что-бы передать более понятно автору библиотеки что он должен сделать (я подозреваю, что он просто взял готовый исходник этой библиотеки и слегка доработал ее особо не вникая в основную ее работу)
Надеюсь таким способом точно сработает.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 13:45

Glyckmen, дельфисту CopyMemory ни к чему -- там указатели есть в языке.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 86

    TopList