2010-02-10 11 views
7

Bunun için googled ve burada bazı konuları okumak, ama kısa bir süre için bir VB.Net uygulama uyku ve hala duyarlı uygulamayı tutmak için basit bir yol bulmuş değil: gerçektenBasit, engellenmeyen bir şekilde uyumak için?

Imports System.Net 
Imports System.IO 
Imports System.Text 
Imports System.Text.RegularExpressions 
Imports System.Threading.Thread 

[...] 

''#How to keep screen frop freezing? 
While True 
    ListBox1.Items.Clear() 

    ListBox1.Items.Add("blah") 

    ''#Not much difference 
    ListBox1.Refresh() 

    ''#Wait 1mn 
    Sleep(60000) 
End While 

mi var Bir VB.Net uygulamasına sahip olmak için basit, engellenmeyen bir çözüm yok birkaç saniye bekleyin?

Teşekkür ederiz.

+1

uyku amacı nedir VB içindir? Ya uyumak istiyorsun ya da cevap vermek istiyorsun. Yapmaya çalıştığınız şey, planlanmış aralıklarla gerçekleşen bir şeyse, o zaman söyleyin. – dbasnett

+0

Ekranı her dakika bir sayfa kazıyorum ve uygulama ekranının donması olmadan uygulamanın her dakika duraklamasını istiyorum. DoEvents kullanmak hala iyi mi, yoksa bunun yerine bir Zamanlayıcı kullanılması tavsiye edilir mi? – Gulbahar

+0

@OverTheRainbow - Aşağıdaki niki'nin yorumuna bakın. Bir zamanlayıcı ile en iyisi gibisin. –

cevap

7

Bu WinForms veya WPF mi?

Eğer WinForms ise, sadece while döngüsü yerine bir zamanlayıcı kullanabilirsiniz. Ardından, uygulamanız yine de yanıt verebilir ve etkinlikleri artırır.

WPF'de, kendi zamanlayıcıyı DispatchTimer class'a göre yapmanız gerektiğini düşünüyorum.

+0

WPF'de zamanlayıcılar da yok mu? – CoderDennis

+0

Bir projeyi gerçekten hızlı bir şekilde açtım ve tasarımcıda herhangi bir Zamanlayıcı kontrolünü görmedim, bu yüzden çok iyi olabilir, WPF'de hiç kullanmam gerekmedim. Google'da yapılan hızlı bir arama, uygun olmadığını düşünmemi sağlıyor (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/aaffea95-e735-492d-]a-2fdf7099a936/). –

+0

Bir kontrol olmak zorunda değil mi? System.Timers.Timer veya System.Threading.Timer kodunu kodda kullanabilirsiniz. – ryadavilli

2

Zamanlayıcı önerisi bunu yapmanın en iyi yoludur. DoEvents hala (ben 5.0 beri VB yapmadıysanız) çalışır Ama eğer bunu yapabilirsiniz: Bu .1 ikinci her 600 uyur yapacağını

For i = 0 To 600 
    DoEvents 
    Sleep(100) 
Next 

, her biri arasında bir DoEvents ile güncel olayları ele almak. .1 saniye, yanıtlama (olayları .1 saniye içinde ele alınır) ve CPU tüketimi (bu çok hızlı ve uygulamanız beklerken bile önemli miktarda CPU süresi tüketmeye başlayacaktır) arasında iyi bir tradeoff olmalıdır.

+0

Sevgili downvoter, reddetmenizi saygıyla kabul ederken, cevabımı geliştirebileceğim bir yorum yapmayı düşünür müsünüz? Teşekkürler. – Wim

+0

Neden bunun neden reddedildiğini bilmiyorum. İşlevler, .NET uygulamasında Application.DoEvents ve Thread.Sleep olarak adlandırılır, ancak güncel bir MSDN olan herkes bunu bulabilirdi. DoEvent'lerin her türlü garip davranışa yol açabileceğine dikkat edilmelidir (ör., Işlev çalışırken veya DoEvents aynı işlevi tekrar çağırırsa, form kapatılırsa). Ancak bunu yapmanın en iyi yolu olmadığını söylemiştiniz. . – Niki

+1

Downvoter değilim, ancak DoEvents iyi bir uygulama değildir. Yeniden giriş için hesap doğru yazılmış değilse, sorunlara neden olur. –

7
Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer) 
    Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds/500 
    For i = 1 To iHalfSeconds 
     Threading.Thread.Sleep(500) : Application.DoEvents() 
    Next i 
End Sub 

Uygulamayı oldukça duyarlı tutarken belirli bir kod parçasını duraklatmak için ResponsiveSleep'ı çağırın. daha duyarlı iHalfSeconds onda veya yüzde biri ikinci

+1

Bu yöntem Kronometreden daha az CPU kaynağı kullanmıştır. – rsrobbins

+2

Application.DoEvents() 'ile ilgili sorun yaşadım. Bkz. [Burada] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/48b4a763-7387-46da-8fc2-3e885670f62c/the-undo-operation-encountered-a-context-that-is -different? forum = netfxbcl), örneğin. – pelesl

+0

, '' 'VB'ye özgü bir şey inşa etmektir? Bu nasıl görünüyor C#? – Nyerguds

4
Private Sub wait(ByVal interval As Integer) 
    Dim stopW As New Stopwatch 
    stopW.Start() 
    Do While stopW.ElapsedMilliseconds < interval 
     ' Allows your UI to remain responsive 
     Application.DoEvents() 
    Loop 
    stopW.Stop() 
End Sub 
2

Gerçekten, çözüm iki katlık için değiştirilmiş olabilir uygulamayı yapmak için: onun söylediği gibi uyku yapar 1.) uyumak yerine bir zamanlayıcı kullanın nedenleri uyumak için iplik. 2.) Çok iş parçacığı kullanın ve ekran kaydırma işlevinizin kendi iş parçacığı içinde çalışmasını sağlayın; bu, uygulamanızın yanıt verimini büyük ölçüde artıracaktır.

Threading.Thread.Sleep(IntSleepTime) 

belirtilen süre boyunca geçerli iş parçacığı duraklatacak evresel uyku fonksiyonu, böylece sen uyku kullanmak olsaydı, çok uçlu bir ortamda bunu yapabilirsiniz ve geri kalanı tutacak ana Uygulama sadece ana iş parçacığına değil dallanmış bir iş parçacığı uyuyarak yanıt veriyor.

0

U UI İş parçacığını uyutur. u ilk ur liste görünümü iplik uyku yapmak için liste görünümünde öğeler eklemek ve ur form yüklendiğinde iplik kullanarak bu yöntemi başladığınızda, artık uykuya ihtiyacın bir yöntem yapmak ve ur duyarlı olacaktır dan, ur uygulama duyarlı olmak için devlet ..

0

Bu değil VBA

Private Async Function PauseTime(ByVal MS As Integer) As Task 

    Await Task.Run(Sub()       
          Thread.Sleep(MS) 

        End Sub) 


    End Function 
İlgili konular