VBStreets Conference - Преглед на темата - Въпрос за събитията

Целият вкус на програмирането!

  • Списък на форумитеVisual basicVisual Basic 1-6
  • Променете размера на шрифта
  • ЧЗВ
  • вход

Въпрос за събитията. Как да се справим със заекването на формата.

Въпрос за събитията. Как да се справим със заекването на формата.

Не, тя прави нещо съвсем различно. Той просто обработва натрупаните кликвания, клавиши и др.
Системата прехвърля контрола върху себе си, когато пожелае.

Като цяло решението на проблема е просто да се принудят функциите на DoEvents в тесни места.

Ще покажа парче код с коментари
Код: Изберете всички '*****************************
„това парче не е важно за разбирането
'времето за изпълнение е някъде от 0,05 сек до 3 сек
Частен Sub mnuWriteToDisk_Click ()
ReDim буфери (0)
Извикайте WriteModule (SelectedItemMenuMod) 'SelectedItemMenuMod - променлива с номера на елемента от списъка
'записва сервизния информационен модул, за да завинтва палачинки
ReDim буфери (0)
Крайна под
'******************************

'******************************
'но това нещо записва всички маркирани
'ако не направете DoEvents
'след това, докато всичко работи, тогава формулярите за кандидатстване висят
'и нищо не се случва с бутона STOP
Частен Sub mnuWriteAllToDisk_Click ()

Dim XX като байт
Затъмнете NextMod като етикет

ProgressBarMod.Min = 0
ProgressBarMod.Max = 100

bStopMOD = Невярно
За XX = 1 До (lw1.ListItems.Count)
lw1.ListItems.Item (XX) .Selected = True
SelectedItemMenuMod = XX
Ако lw1.ListItems.Item (XX) .Checked = False След това преминете към NextMod

ReDim буфери (0)
Call CallModule (SelectedItemMenuMod)
ReDim буфери (0)

DoEvents 'ТОВА Е ТОВА.
преди да проверите бутона STOP
'можете да прободете няколко парчета в процедурата
'където бих искал да закача нещо (обратното на "вися")

Ако bStopMOD = Вярно тогава
ProgressBarMod.Value = 0
ProgressBarMod.DrawProgressBar
Излезте от под
Край ако

NextMod: ProgressBarMod.Value = Int ((XX * 100) \ (lw1.ListItems.Count))
ProgressBarMod.DrawProgressBar
lw1.Опресняване

Следващата XX
ProgressBarMod.Value = 0
ProgressBarMod.DrawProgressBar
Крайна под
'******************************

Wildwhiteash В горния пример Doevents се появява след процедурата. Това имам предвид, че опашката все пак трябва да достигне DoEvents и тя ще дойде след процедурата "Call CallModule (SelectedItemMenuMod)" .
Ето кода, който използвам:
Код: Изберете всички strComputer = "."
Задайте objWMIService = GetObject (_
"winmgmts: \\" & strComputer & "\ root \ cimv2")
Задайте colPings = objWMIService.ExecQuery _
("Изберете * От Win32_PingStatus където Address = '192.168.1.1'")

За всеки objStatus в сравнения
Ако IsNull (objStatus.StatusCode) _
или objStatus.StatusCode <> 0 Тогава
WScript.Echo "Компютърът не отговори."
Иначе
Wscript.Echo "Компютърът отговори."
Край ако
Следващия

Така че, за мен, докато IsNull (objStatus.StatusCode) не работи, програмата вече не се изпълнява и отнема няколко секунди, за да изчака, за което програмата е "затворена". Добавянето на DoEvents в реда отгоре или отдолу не решава проблема, защото чакаме изпълнението на горната функция.
Ако греша, поправете.

Antonariy Бихте ли обяснили как да направите това.