Not Responding

8 отговора 0 прегледа
#1

Not Responding

Здравейте!
Имам форма, която прави обработка с много изчисления, което отнема (на моя компютър) 20-25 сек.
Формата опреснява ProgressBar.
Всичко работи добре, но преди да е завършила обработката ProgressBara-a спира да се опреснява и в заглавито на формата се появява Not Responding.
Всичко се опреснява, чак когато процеса завърши, въпреки, че AutoRedraw=Tue.
Става дума за VB6.
Как да избегна това?
Благодаря!

Отговор
в отговор на SteveS #2

Re: Not Responding

Вътре в цикъла за смятане слагаш DoEvents.

For s = 1 to 100
DoEvents
Print s
Print "Neshto drugo..."
'........ пишеш колкото неща имаш за смятане
Next

И после кажи дали става.

Щирлиц
Отговор
в отговор на Щиpлиц #3

Re: Not Responding

Става, ама потребителят може да затвори формата или да цъкне по някой бутон! И после формата leak-ва, мдам.

Аз бих сложил едно Me.Enabled = False преди цикъла и обратното след него.

cheers,
</wqw>


[линк]
Отговор
в отговор на wqw #4

Re: Not Responding

Разбира се, но това е индивидуален случай за всеки проект. Аз например най-често пиша такива цикли в отделна форма, която има само бутон "Cancel". И на този бутон се пада честта при натискане да спре цикъла. Човека питаше как да "отпуши" програмата, за да му рефрешва и визуалните форми.

Като стигне до следващите грешки и проблеми - пак ще пише, вервайте ми. ;о)

Щирлиц
Отговор
в отговор на Щиpлиц #5

Re: Not Responding

Наистина с DoEvents става, но както казва wqw, докато върви обработката формата започва да приема събития от контролите и става "мармалад".
Трябва да се измисли нещо друго.
Май най-добре е да има отделна форма, която да показва само ProgressBar-а и нищо друго.
Ако се сетите нещо друго, моля пишете отново!

Отговор
в отговор на SteveS #6

Re: Not Responding

При мен това не "запецва"
Option Explicit


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function UpdateWindow Lib "user32" (ByVal hWnd As Long) As Long

Private Sub Command1_Click()
Dim dblTimer As Double

dblTimer = Timer
Do While Timer < dblTimer + 5
Label1 = Timer
Call Sleep(100)
Call UpdateWindow(hWnd)
Loop
End Sub

cheers,
</wqw>


[линк]
Отговор
в отговор на wqw #7

Re: Not Responding

Много странно. Защото аз снощи реших да го пробвам, и така "запецна", че въобще не ще да излезе от loop-а. ;о(

Всъщност знам и защо. По странно стечение на обстоятелствата - съм стартирал програмата в последните 4 секунди преди полунощ.

Проблеми винаги ще има, но поставения в тази тема въпрос може да се реши едва след като разгледаме сорс-а, и преценим къде и какви проверки да се сложат. И аз съм правил цикли, и то с ProgressBar (който реших даже сам да си направя, защото исках цифричките да са вътре в лентата), и по време на въртене на циклите има и DoEvents, има и проверка с If за прекъсване на изпълнението, така че без значение в коя форма се намира бутона Cancel - винаги може да се прекъсне мазането.

Човека казва, че формата продължавала да приема събития от контролите... Ами нормално е. Ако не ги е изключил с .Enable = False - така ще става. Решението е индивидуално.

Щирлиц
Отговор
в отговор на SteveS #8

Re: Not Responding

Здравейте,
Да кажа само че може да се дефинира отделна нишка, която да се управлява от цикъла за изчисление и да движи прогрес бара без проблеми.
Въпреки това мисля че с доевентс с ме.енейбъл = фалс е най-простия начин.

Отговор
в отговор на Ascona_83 #9

Re: Not Responding

И как ползваш нишки във Visual Basic 6?


Отговор