Как "убить" процедуру извне?

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

Как "убить" процедуру извне?

Сообщение Citius » 08.08.2007 (Ср) 21:15

Смысл таков, у меня выполняется процедура поиска, как мне при выполнении этой процедуры отключить её?

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

Сообщение Хакер » 08.08.2007 (Ср) 21:30

ёёё.... :roll:

1) Требуется объяснить, что значит "извне".
2) Отвечая на заданный вопрос ( и понимая при этом, что автор имел ввиду что-то другое, причём его вопрос явно не имеет смысла, поскольку автор явно не понимает, что всё выполняется последовательно, и конечно же не знает ничего про потоки, иначе его вопрос выглядел бы иначе):

Exit Sub
или
Exit Function

(в зависимости от типа процедуры)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 08.08.2007 (Ср) 21:45

Хакер писал(а):ёёё.... :roll:

1) Требуется объяснить, что значит "извне".
2) Отвечая на заданный вопрос ( и понимая при этом, что автор имел ввиду что-то другое, причём его вопрос явно не имеет смысла, поскольку автор явно не понимает, что всё выполняется последовательно, и конечно же не знает ничего про потоки, иначе его вопрос выглядел бы иначе):

Exit Sub
или
Exit Function

(в зависимости от типа процедуры)


Да ты совершенно прав, я ничерта не смыслю про потоки и стэки. А "извне" описано: отключить процедуру из другой процедуры. На этой же форме. Я это так сформулировал.

Прошу помочь.

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

Сообщение Хакер » 08.08.2007 (Ср) 21:50

Интересно, как связаны потоки и стэки (стэк - он один в пределах потока)? И вообще причём тут стеки?

А "извне" описано: отключить процедуру из другой процедуры.


В один момент в одном потоке выполннние находится в одной процедуре.

Пока выполненяется процедура А, "отключить" её из Б нельзя - выполнение ещё не дошло до Б.

До Б выполнение дойдёт при возврате из процедуры А. И тогда будет выполняться (продолжать выполняться ) процедура Б. И уже нечего будет "отключать", потому что процедура А выполняться уже не будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 08.08.2007 (Ср) 21:54

Хакер писал(а):Интересно, как связаны потоки и стэки (стэк - он один в пределах потока)?

Кхм-кхм, а фиберы?


Хакер писал(а):До Б выполнение дойдёт при возврате из процедуры А.

Или при вызове её из процедуры А.
Прямом или косвенном (например из DoEvents).
Последний раз редактировалось tyomitch 08.08.2007 (Ср) 21:56, всего редактировалось 1 раз.
Изображение

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

Сообщение Хакер » 08.08.2007 (Ср) 21:55

Ах да...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Хакер » 08.08.2007 (Ср) 22:05

Кхм-кхм, а фиберы?


И всё так, я так подумал, а в чём претензия?

Или при вызове её из процедуры А.
Прямом или косвенном (например из DoEvents).


1) Предполагается, что у автора есть Б, из которй он вызывает А. И хочет при этом из Б каким-то образом убить А.

2) Тогда выполнение до Б(1) всё равно дойдёт после выполнения А (которое закончится после вызова и возврата из Б(2), в А).

(В скобках (после буквы Б) указан... хм.. ну скажем, стековый фрейм той процедуры, о котой идёт речь.)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 08.08.2007 (Ср) 22:11

Не ребята я пас, что-то меня это все пугает :( буду тихо смирно ждать когда закончится мой поиск :(

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

Сообщение tyomitch » 08.08.2007 (Ср) 22:11

Хакер писал(а):
Кхм-кхм, а фиберы?


И всё так, я так подумал, а в чём претензия?

Смотря что ты считаешь стеком.

а) После того, как поток переключился на новый стек, его старый стек остаётся стеком, или становится просто мусором в памяти?

б) Если поток хранит в esp какой-нибудь свой мусор для вычислений, то у него есть стек или нет?


Хакер писал(а):
Или при вызове её из процедуры А.
Прямом или косвенном (например из DoEvents).


1) Предполагается, что у автора есть Б, из которй он вызывает А. И хочет при этом из Б каким-то образом убить А.

Кем предполагается?
Изображение

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

Сообщение Хакер » 08.08.2007 (Ср) 22:44

а) После того, как поток переключился на новый стек, его старый стек остаётся стеком, или становится просто мусором в памяти?


У каждого потока свой стек и свой контекст. О чём речь-то?

б) Если поток хранит в esp какой-нибудь свой мусор для вычислений, то у него есть стек или нет?


Если поток это делает (не знаю, правда, зачем это может быть нужно), то свой стек у него остаётся (никто с ним ничего не делает), но работать с этим стеком посредствам push*,pop*-инструкций он не сможет, пока в esp не появится валидное значение. Их конечно можно вызвать, вдруг тот "мусор" в esp окажется валидным указателем на закоммитченную область АП (вызов инструкции в этом случае не приведёт в GPF). Тогда значение "мусора" изменится на 4, а по адресу ["мусор"] что-то запишется (в случае вызова push*-а), или же наоборот, что-то оттуда запишется в регистр (а случае вызова pop*-а).

Я ведь прекрасно знаю, что ты всё это знаешь - зачем меня спрашиваешь? :) Проверяешь, что-ли?

Кем предполагается?


Изначально предполагается автором, что он из процедуры Б, вызывает процедуру А (по его словам - процедуру поиска) и при этом хочет из процедуры Б убить процедуру А, до того произошёл возврат из А в Б.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 09.08.2007 (Чт) 3:02

Короче он хочет сделать отмену поиска.
Автор
Самый простой для тебя способ будет создать в модуле булевый флаг и в процедуре поиска проверять его.

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

Сообщение Хакер » 09.08.2007 (Чт) 3:04

FaKk2
А кто его изменит, - этот булев флаг, пока процедура поиска работает?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 09.08.2007 (Чт) 3:05

Хакер
DoEvents плюс кнопка "Отмена". За примером сходи в виндовый поиск, там тоже отменять можно :)

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

Сообщение Хакер » 09.08.2007 (Чт) 3:13

Из DoEvents произойдёт возврат обратно в процедуру поиска. И она сама себя "убьёт" {Exit Sub}-ом.

А автору надо:
отключить процедуру из другой процедуры


Поэтому автору прямой ответ - это невозможно в принципе, так как в один момент в одном потоке выполняется только одна "процедура".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 09.08.2007 (Чт) 5:59

Хакер писал(а):
а) После того, как поток переключился на новый стек, его старый стек остаётся стеком, или становится просто мусором в памяти?


У каждого потока свой стек и свой контекст. О чём речь-то?

Поток может создать новый стек и переключиться на него?

Да, может. CreateFiber + SwitchToFiber.

Если ты подумал про переключение потоков, то я не о нём.


Хакер писал(а):
Кем предполагается?


Изначально предполагается автором, что он из процедуры Б, вызывает процедуру А (по его словам - процедуру поиска) и при этом хочет из процедуры Б убить процедуру А, до того произошёл возврат из А в Б.

В постах автора я такой формализации его вопроса не видел.
Если честно, то я вообще не понял, чего ему нужно.
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 09.08.2007 (Чт) 8:53

Я делаю так, может есть более продвинутые способы?

Код: Выделить всё
Sub Command1_Click() 'поиск
   ExitFlag = False

   'перебор элементов

   For i = 1 to Elements
      ...
      DoEvents

      If ExitFlag Then Exit For
   Next

End Sub

Sub Command2_Click() ' выход из поиска
   ExitFlag = True
End Sub
O, sancta simplicitas!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.08.2007 (Чт) 9:13

Не в меру головастые коллеги совсем запугали автора :)
Citius, тебе нужно то, что написал pronto.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 09.08.2007 (Чт) 9:21

tyomitch писал(а):В постах автора я такой формализации его вопроса не видел.
Если честно, то я вообще не понял, чего ему нужно.


Я так понял, что он хочет "убить выполняющуюся процедуру", по аналогии с "убиением выполняющегося процесса".

Не видя при этом колоссальную разницу между процессом и процедурой.

Antonariy писал(а):Не в меру головастые коллеги совсем запугали автора

Горе от ума :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.08.2007 (Чт) 9:34

Хакер писал(а):Я так понял, что он хочет "убить выполняющуюся процедуру", по аналогии с "убиением выполняющегося процесса".)

Перечитай первый пост и не придумывай смысл за автора. Про потоки и процессы это уже ты сказал.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Хакер » 09.08.2007 (Чт) 9:38

alibek
Хватит писать мне "Перечитай <то-то и то-то>" по всякому поводу и даже без оного (тебе это очень нравится, как я смотрю).

А вот ты перечитай - да - весь топик. И про потоки, и про процессы. И почему и в каком смысле каждое понятие было мною употреблено тоже посмотри.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 09.08.2007 (Чт) 11:00

Хакер писал(а):
б) Если поток хранит в esp какой-нибудь свой мусор для вычислений, то у него есть стек или нет?


Если поток это делает (не знаю, правда, зачем это может быть нужно)

Ну нехватило программисту семи регистров, понадобился восьмой. Мало ли?


И про фиберы, ты всё-таки поверил, что их использование позволяет создать кучу стеков в однопоточной программе? :-)
Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 09.08.2007 (Чт) 22:29

offtop: Ребят, а ребят.. Травкой поделитесь, а? ,-)
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 93

    TopList