Hallå! absolut lättast är att göra en egen msgbox , det är ju inte så mycket magiska saker på dom. ska man bygga ett nytt formulär? Du måste bestämma när formen visats åt användaren och spara Environment.TickCount() i en Integervariabel. Detta fryser systemet Testa följande kod, det borde göra det du vill... Det är ett "fult" sätt att göra det på. Då du kommer belasta processorn helt i onödan. En Sleep belastar inte procssorn lika mycket... Det är marginellt ;) Allt är så marginellt, både hur mycket processorkraft det tar och tiden det tar att hoppa in och ur tråden etc... Nä, men det blir inte exakt. Eftersom att det endå finns ett antal saker som kan strula till det så tycker jag att en Sleep vore bättre eftersom att den inte drar något ifrån processorn i princip och är hyffsat exakt... Ja, men då byter man bara ut loopen mot en Sleep(1000) istället... Kör denna kod... Dotnet program tar mycket minne i regel av någon anledning... Eftersom Sleep "fryser" tråden. Kommer inte meddelanden i fönster kön att behandlas. Du kan testa att tvingar fönstret att rita om innan du anropar sleep. Jag tror han kör Sleep på maintråden och då är det ju självklart att det låser sig...visa msgbox enabrt 1 sek
Hade tänkt lägga in ett meddelande som ska visas i säg 1 sek sen försvinna utan att behöva klicka ok.
Alltså typ en msgbox som visas en viss tid.
Hur?
Programerar i VS.NET med VB.NETSv: visa msgbox enabrt 1 sek
annars _går_ det att via subclassing av win32 meddelandena att mecka med standard msgboxen.
du kan tex snappa upp wm_showdialog där du får ett hwnd till messageboxen , med det hwnd't kan du göra det mesta med själva msgboxfönstret , stänga det , flytta det , lägga till nya saker på det osv.
men som sagt , gör en egen , så blir det lättare..
//RogerSv: visa msgbox enabrt 1 sek
Hur får man den att visas i ex 1 sek då?
Förklara gärna lite mer....
/JSv: visa msgbox enabrt 1 sek
Och sedan använder du antingen en timer eller en egen tråd som räknar ut hur länge den har visats genom att räkna Environment.TickCount() - TickCountVariabel, och om resultatet blir 1000 eller mer har formen visats i 1 sekund...
1000 millisekunder = 1 sekund...
Skulle själv föredra att köra i en egen tråd, det är den exaktaste funktionen för att kontrollera tiden...
Och en tråd är inte svår att skapa...
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
System.Threading.Thread.Sleep(4000)
annars kan man köra med timer funktionen som finns i .net
/JSv: visa msgbox enabrt 1 sek
<code>
'Högst uppe i filen
Imports System.Threading
'Resten i form klassen
Private Tick As Integer = -1
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
'Vi kör funktionen i Form.Activate eventet för att vara säkra på att användaren ser formen i 1 sekund.
'Om det inte fungerar bra sätt in den i Form.Load eventet istället.
If Tick = -1 Then
'Vår tråd som kör vid sidan om maintråden
Dim TimeThread As New Thread(AddressOf TimeLoop)
Tick = Environment.TickCount
'Startar tråden och går vidare, efter denna rad har vi två trådar som kör. Denna maintråd och den vi nyss skapat.
TimeThread.Start()
End If
End Sub
Private Sub TimeLoop()
'Loopar tills fönstret har visats i 1 sekund eller ev. liiiite mer.
Do Until Environment.TickCount - Tick >= 1000
Thread.CurrentThread.Sleep(10)
Loop
'Stänger fönstret
Me.Close()
End Sub
</code>
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
Sv: visa msgbox enabrt 1 sek
Självklart kan man bara ha en Sleep(1000) men det är inte riktigt exakt...
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
Dessutom får du tänka på att har antagligen inte har flera processorer så att hoppandet mellan trådar kommer också att ta tid. Samt skapa/förstöra fönstretSv: visa msgbox enabrt 1 sek
Varför är man så rädd för att använda lite processorkraft maximalt en sekund?
Dessutom, vad kan det ökas i procent när man kör en extra tråd?! Inte många procent i alla fall...
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
Sv: visa msgbox enabrt 1 sek
Någon millisekund hit och dit är ju inget man märker precis.
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
Dim x As New box()
x.Show()
System.Threading.Thread.Sleep(4000)
x.Close()
men då när jag öppnar boxen(winform) så hinner den inte visa allt som ska finnas i boxen innan den stängs igen.
Alltså jag får upp fönstret men inte med rätt innehåll, tiden stämmer också på ett ungefär (spelar inte någon roll om tiden inte är helt exakt).
Kör jag istället denna kod.
Public x As New box()
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Timer1.Enabled = True
x = New box()
x.Show()
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Enabled = False
x.Close()
End Sub
då fungerar det som jag hade tänkt mig....
den sista lösningen kanske tar mycket minne??
/JSv: visa msgbox enabrt 1 sek
Vilken anledning vet jag inte exakt...
Har du inte försökt göra som jag skrev före men byta ut loopen i trådloopen till bara Thread.CurrentThread.Sleep(4000)?
Fungerar det med en timer så använd en timer...
Mvh,
ThomasSv: visa msgbox enabrt 1 sek
Varför inte lägga timer kontrollen i box formuläret? Sv: visa msgbox enabrt 1 sek
Men om han har en egen tråd som agerar timer och kör en sleep på den så fortsätter maintråden att snurra...
Mvh,
Thomas