Not Responding
8 отговора
0 прегледа
Not Responding
Здравейте!
Имам форма, която прави обработка с много изчисления, което отнема (на моя компютър) 20-25 сек.
Формата опреснява ProgressBar.
Всичко работи добре, но преди да е завършила обработката ProgressBara-a спира да се опреснява и в заглавито на формата се появява Not Responding.
Всичко се опреснява, чак когато процеса завърши, въпреки, че AutoRedraw=Tue.
Става дума за VB6.
Как да избегна това?
Благодаря!
Имам форма, която прави обработка с много изчисления, което отнема (на моя компютър) 20-25 сек.
Формата опреснява ProgressBar.
Всичко работи добре, но преди да е завършила обработката ProgressBara-a спира да се опреснява и в заглавито на формата се появява Not Responding.
Всичко се опреснява, чак когато процеса завърши, въпреки, че AutoRedraw=Tue.
Става дума за VB6.
Как да избегна това?
Благодаря!
Re: Not Responding
Вътре в цикъла за смятане слагаш DoEvents.
For s = 1 to 100
DoEvents
Print s
Print "Neshto drugo..."
'........ пишеш колкото неща имаш за смятане
Next
И после кажи дали става.
Щирлиц
For s = 1 to 100
DoEvents
Print s
Print "Neshto drugo..."
'........ пишеш колкото неща имаш за смятане
Next
И после кажи дали става.
Щирлиц
Re: Not Responding
Става, ама потребителят може да затвори формата или да цъкне по някой бутон! И после формата leak-ва, мдам.
Аз бих сложил едно Me.Enabled = False преди цикъла и обратното след него.
cheers,
</wqw>
[линк]
Аз бих сложил едно Me.Enabled = False преди цикъла и обратното след него.
cheers,
</wqw>
[линк]
Re: Not Responding
Разбира се, но това е индивидуален случай за всеки проект. Аз например най-често пиша такива цикли в отделна форма, която има само бутон "Cancel". И на този бутон се пада честта при натискане да спре цикъла. Човека питаше как да "отпуши" програмата, за да му рефрешва и визуалните форми.
Като стигне до следващите грешки и проблеми - пак ще пише, вервайте ми. ;о)
Щирлиц
Като стигне до следващите грешки и проблеми - пак ще пише, вервайте ми. ;о)
Щирлиц
Re: Not Responding
Наистина с DoEvents става, но както казва wqw, докато върви обработката формата започва да приема събития от контролите и става "мармалад".
Трябва да се измисли нещо друго.
Май най-добре е да има отделна форма, която да показва само ProgressBar-а и нищо друго.
Ако се сетите нещо друго, моля пишете отново!
Трябва да се измисли нещо друго.
Май най-добре е да има отделна форма, която да показва само ProgressBar-а и нищо друго.
Ако се сетите нещо друго, моля пишете отново!
Re: Not Responding
При мен това не "запецва"
cheers,
</wqw>
[линк]
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>
[линк]
Re: Not Responding
Много странно. Защото аз снощи реших да го пробвам, и така "запецна", че въобще не ще да излезе от loop-а. ;о(
Всъщност знам и защо. По странно стечение на обстоятелствата - съм стартирал програмата в последните 4 секунди преди полунощ.
Проблеми винаги ще има, но поставения в тази тема въпрос може да се реши едва след като разгледаме сорс-а, и преценим къде и какви проверки да се сложат. И аз съм правил цикли, и то с ProgressBar (който реших даже сам да си направя, защото исках цифричките да са вътре в лентата), и по време на въртене на циклите има и DoEvents, има и проверка с If за прекъсване на изпълнението, така че без значение в коя форма се намира бутона Cancel - винаги може да се прекъсне мазането.
Човека казва, че формата продължавала да приема събития от контролите... Ами нормално е. Ако не ги е изключил с .Enable = False - така ще става. Решението е индивидуално.
Щирлиц
Всъщност знам и защо. По странно стечение на обстоятелствата - съм стартирал програмата в последните 4 секунди преди полунощ.
Проблеми винаги ще има, но поставения в тази тема въпрос може да се реши едва след като разгледаме сорс-а, и преценим къде и какви проверки да се сложат. И аз съм правил цикли, и то с ProgressBar (който реших даже сам да си направя, защото исках цифричките да са вътре в лентата), и по време на въртене на циклите има и DoEvents, има и проверка с If за прекъсване на изпълнението, така че без значение в коя форма се намира бутона Cancel - винаги може да се прекъсне мазането.
Човека казва, че формата продължавала да приема събития от контролите... Ами нормално е. Ако не ги е изключил с .Enable = False - така ще става. Решението е индивидуално.
Щирлиц
Re: Not Responding
Здравейте,
Да кажа само че може да се дефинира отделна нишка, която да се управлява от цикъла за изчисление и да движи прогрес бара без проблеми.
Въпреки това мисля че с доевентс с ме.енейбъл = фалс е най-простия начин.
Да кажа само че може да се дефинира отделна нишка, която да се управлява от цикъла за изчисление и да движи прогрес бара без проблеми.
Въпреки това мисля че с доевентс с ме.енейбъл = фалс е най-простия начин.