DoEvents и закрытие формы

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

DoEvents и закрытие формы

Сообщение Nikita » 08.10.2003 (Ср) 10:59

MDIForm, в одном из Child-ов идет длительный процесс (отрисовка-заполнение-..), соответственно DoEvents чтобы можно было параллельно делать что-то еще. При этом, если во время работы этого процесса, закрыть MDIForm, все падает поскольку Child продолжает работать, вызывает объекты MDIForm, та пытается снова загрузиться и тп.
Либо, другая проблема, хочется чтобы при закрытии MDIForm, программа полностью прекращалась, в том числе и все долгоработающие Child-ы

Как такое сделать?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 08.10.2003 (Ср) 13:09

на вскидку такое решение пришлов голову:

определяешь для нужной тебе формы Public свойство. тип свойства - Boolean (хотя можно и строковый, тогда больше возможностей по управлению процессом будет). в цикле твоего процесса (а точнее в самом начале этого цикла) проверяй состояние свойства, и если оно установлено в True (или как ты там определишся), выходи из цикла... ну а дальше по обстаятельствам (можешь, например, выгрузить эту форму).
в дополнение к этому свойству можно еще определить на этой форме событие (твое собственное). только в этом случае придется где-то переменную этой формы держать...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.10.2003 (Ср) 14:39

На главной форме запрещаешь ControlBox и делаешь свою кнопку "Закрыть" с кодом:
Код: Выделить всё
End

но не
Код: Выделить всё
Unload Me

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 08.10.2003 (Ср) 14:49

Mikle писал(а):На главной форме запрещаешь ControlBox и делаешь свою кнопку "Закрыть" с кодом:
Код: Выделить всё
End

но не
Код: Выделить всё
Unload Me

трудностей ищете, да?
вот почитайте для общего развития...
"Как узнать Где запущена прога" - на старом форуме
"Как её выгрузить?" - на старом форуме
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Nikita
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.02.2003 (Ср) 15:09
Откуда: Russia

Сообщение Nikita » 08.10.2003 (Ср) 15:33

я поставил в MDIForm_Unload флаг, но Child в своем цикле не успевает проверить это свойство, MDIForm закрывается и сразу вызывается MDIForm_Load и дальше все падает (поскольку в MDIForm_load вызывается то что уже выгружено)
Последний раз редактировалось Nikita 08.10.2003 (Ср) 15:34, всего редактировалось 1 раз.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.10.2003 (Ср) 15:33

Почитал, поучительно. Но там есть одна фраза:
"End убивает только то, что создано "стандартным" способом."
которую можно понять и так:
Если в программе все сделано стандартно, без API, DLL,и т. д., можно обойтись и End.
А то, что предварительно нужно удалять созданные объекты (если есть), так это само собой.[/u]

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 08.10.2003 (Ср) 15:50

Nikita писал(а):я поставил в MDIForm_Unload флаг, но Child в своем цикле не успевает проверить это свойство, MDIForm закрывается и сразу вызывается MDIForm_Load и дальше все падает (поскольку в MDIForm_load вызывается то что уже выгружено)

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

примерно так:

ChildForm
Код: Выделить всё
Option Explicit

Private m_Messages As String ' внутренняя переменная для нашего свойства
'--- само свойство
Public Property Let SmartMessage(NewValue As String)
  m_Messages = NewValue
End Property

Public Property Get SmartMessage() As String
  SmartMessage = m_Messages
End Property
'--- закончилось
Sub LongProccess() ' процедура в которой делается что-то очень долго

  Do
    ' в начале каждого шага цикла проверяем сообщение
    If m_Messages = "stop" Then Exit Do ' выход из цикла
   
    ' делаем то, что нам нужно
    ...
    ...
    DoEvents
   
  Loop
 
  ' обратное сообщение, чтоб MDI-форма знала что процесс остановлен
  If m_Messages = "stop" Then m_Messages = "stoped"
End Sub


MDIForm
ну тут все просто. процедура выхода
Код: Выделить всё
Sub ExitProgramm()
  ChildForm.SmartMessage = "stop"
  Do Until ChildForm.SmartMessage = "stoped"
    DoEvents
  Loop
  Unload Me
End Sub


з.ы. кстати, интересная :idea:... надо будет ее развить...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Nikita
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.02.2003 (Ср) 15:09
Откуда: Russia

Сообщение Nikita » 08.10.2003 (Ср) 15:53

END помогает когда MDIForm закрывается, да оно анлоадит этот Child и прекращает его работу.
Но как сделать тоже самое, не закрывая MDIForm?
Есть в MDIForm пункт в меню, "закрыть все окна", проходит по всем формам, говоря Unload frm, set frm=nothing, оно закрывает все окна, но тут же вызывается Form_Load того Child-a в котором продолжался процесс (процесс ведь продолжается, оно чего-то нарисовать решило, а форма выгружена, хочет загрузить) и загружает его и он продолжает работать.
Как с этим бороться?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 08.10.2003 (Ср) 15:58

Nikita писал(а):END помогает когда MDIForm закрывается, да оно анлоадит этот Child и прекращает его работу.
Но как сделать тоже самое, не закрывая MDIForm?
Есть в MDIForm пункт в меню, "закрыть все окна", проходит по всем формам, говоря Unload frm, set frm=nothing, оно закрывает все окна, но тут же вызывается Form_Load того Child-a в котором продолжался процесс (процесс ведь продолжается, оно чего-то нарисовать решило, а форма выгружена, хочет загрузить) и загружает его и он продолжает работать.
Как с этим бороться?

да также. запиши в это свойство "unload" и сделай соответсвующую проверку в теле цикла.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Nikita
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.02.2003 (Ср) 15:09
Откуда: Russia

Сообщение Nikita » 08.10.2003 (Ср) 16:46

не получается ..
работает Child и DoEvents, когда я иду в меню MDIForm, Child засыпает, когда выхожу из меню, Child просыпается и продолжает работать (это не моя "фича", оно само :))
так вот, когда я жму "Закрыть все" в меню, в это время Child спит
И получается бесконечный цикл Do Until ChildForm.Message="Stopped" поскольку Child не работает в это время, и еще не дошел до Stopped.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 08.10.2003 (Ср) 17:17

Nikita писал(а):не получается ..
работает Child и DoEvents, когда я иду в меню MDIForm, Child засыпает, когда выхожу из меню, Child просыпается и продолжает работать (это не моя "фича", оно само :))
так вот, когда я жму "Закрыть все" в меню, в это время Child спит
И получается бесконечный цикл Do Until ChildForm.Message="Stopped" поскольку Child не работает в это время, и еще не дошел до Stopped.

я понял почему не работает...
мы в процедуре выгрузки говорим "stop" и сразц запускаем цикл Do.
так не пойдет, потому что нужный нам процесс преостановлен и не продолжит свое выполнение до тех пор, пока мы не вйдем из текущей процедуры (следовательно - никогда)
вместо цикла Do используй таймер для отселживания остановки процесса:

Код: Выделить всё
Sub ExitProgramm()
  ChildForm.SmartMessage = "stop"
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  If ChildForm.SmartMessage = "stoped" Then
    Timer1.Enabled = False
    Unload Me ' или чего ты там хочешь сделать
  End If
End Sub
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 5

    TopList