Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 22.05.2011, 18:53 Titel: |
|
|
Code: | Screenres 1024,768,32',,&h01
#Ifndef FALSE
#Define FALSE 0
#Define TRUE (Not FALSE)
#EndIf
Dim Shared As Integer messageON
Dim Shared As Integer threadCount
Sub ThreadSub(text As ZString Ptr)
Dim As String temp = *text
DeAllocate text
Dim As Integer textl = Len(temp)
Dim As Integer yt = 768/2 - 64
Dim As Integer xt = 1024/2 - (textl*4)
Dim As Integer cl = 0
Dim As Double zeit = Timer
Color RGB(255, 255, cl)
Draw String (xt, yt), temp
Do While Timer < (zeit + 5)
Sleep 1
Loop
Color RGB(0, 0, 0)
Draw String (xt, yt), temp
threadCount -= 1
If messageON = TRUE And threadCount = 0 Then
messageON = FALSE
EndIf
End Sub
Sub Message(text As String)
Dim As Any Ptr thread
Dim As ZString Ptr temp = Callocate(Len(text) + 1, 1)
*temp = text
thread = ThreadCreate(Cast(Any Ptr, @ThreadSub), temp)
threadCount += 1
If messageON = FALSE Then
messageON = TRUE
EndIf
End Sub
'In der Hauptschleife:
Dim As Integer a, b
a = 1
b = 0
Do
If a=1 And messageOn = FALSE Then Message("Blablub")
If b=2 And messageOn = FALSE Then Message("Blubbla")
'...
Loop Until InKey = Chr(27) 'ESC - beendet sobald die 5 Sek abgelaufen sinda
Do While messageOn = TRUE
Sleep 1
Loop
End
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 19:02 Titel: |
|
|
Zitat: | Ich möchte in meinem Programm in einer Hauptschleife, in der noch viel anderes passiert, verschiedene Messages zu verschiedenen Zeiten anzeigen lassen. |
Dann würden sich erst recht Threads anbieten. MOD hat ja ein schönes Beispiel gepostet, das mir mit ein klein wenig Anpassung Meldungen auf Tastendruck ausgibt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 19:13 Titel: |
|
|
@nemored
Die FB-Zeichenfunktionen sind nicht Threadsicher...
Meine Messagefunktion schaut im Moment so aus:
Code: | Sub Message(text As String,tim As Integer =300)
Dim As Integer textl=Len(text)
Dim As Integer yt=768/2-64
Dim As Integer xt=1024/2-(textl*4)
Dim As Integer cl=0
If zeit=tim Then
Text=""
zeit=0
Exit Sub
End If
Color RGB(255,255,cl)
Draw String(xt,yt),""+Str(zeit)+"|"+Str(tim)
Color RGB(255,255,255)
zeit=zeit+1
End Sub |
Ich muss jetzt nur wissen, wie ich "zeit" auf 0 setzen kann und gleichzeitig die Sub verlasse? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 19:43 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | @nemored
Die FB-Zeichenfunktionen sind nicht Threadsicher... |
Dann mache sie thread-save. Wozu gibt es MUTEXLOCK und diese Dinge?
Einerseits verstehe ich den Sinn von zeit=zeit+1 nicht - wird die Meldung auch wirklich einmal in der Sekunde aufgerufen? - zum anderen kann ich mir nicht erklären, warum das Verlassen der SUB nicht funktioniert. Bist du sicher, dass sie nicht inzwischen schon ein weiteres Mal aufgerufen wurde, du sie also verlassen und bereits wieder betreten hast?
Ich hätte ja ein funktionierendes Beispiel für meinen vorigen Vorschlag, aber immer nur mit einer Meldung gleichzeitig (eine neue Meldung löscht automatisch die alte). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 19:49 Titel: |
|
|
zeit ist nicht mehr gleich tim, weil zeit ja auf 0 gesetzt wird, bevor die Sub verlassen wird. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 20:01 Titel: |
|
|
Du bist aber immer noch in der IF-Bedingung - die wird nicht abgebrochen, nur weil sich die Bedingung inzwischen geändert hat.
Code: | DIM AS INTEGER a = 1
IF a = 1 THEN
a = 0
PRINT "Bedingung erfuellt"
END IF |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 20:11 Titel: |
|
|
Anscheinend schon, bei mir läuft die Sub unendlich weiter, wenn zeit=0 in der Bedinung "If zeit=tim" ist. Wenn ich das zeit=0 auslasse, verschwindet meine Message. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 20:21 Titel: |
|
|
Unendlich weiterlaufen kann sie sowieso nicht, ist ja keine Schleife drin. Das heißt, dass du inzwischen wieder drin bist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 20:36 Titel: |
|
|
Und wie löse ich das, dass die Message in meinem Programm dann nur einmal angezeigt wird? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 21:06 Titel: |
|
|
Durch Probieren und rumfeilen
Folgendes zeigt dir wie gesagt nur eine Meldung gleichzeitig; eine neue Meldung überschreibt die alte. Für mehrere Meldungen gleichzeitig wird das wesentlich aufwändiger als mit Threads.
Code: | declare sub Message(text as string)
dim taste as integer, meldung as string = ""
print "Druecken Sie eine Taste. ESC beendet das Programm."
do
taste = asc(inkey)
if taste = 27 then exit do
if taste > 0 then meldung = "ASCII-Code " & taste & " "
Message(meldung)
sleep 1
loop
sub Message(text as string)
static zeit as double = 0, status as integer = 0, anzeige as string*17 = ""
if zeit = 0 or anzeige <> text then
zeit = timer
anzeige = text
status = 1
end if
if status = 1 then ' neu schreiben
locate 5, 1
print text
status = 2
end if
if status = 2 and timer > zeit + 5 then ' loeschen
locate 5, 1
print space(len(text))
status = 0
end if
end sub |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 22.05.2011, 21:38, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 21:17 Titel: |
|
|
Hm, zumindest bei mir funktioniert dein Code nicht. Die Message bleibt da stehen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 21:22 Titel: |
|
|
na so ein Mist - ändere "anzeige as string*15" in "anzeige as string*17"
War eine spätere Änderung weiter oben; dachte nicht, dass die Probleme macht. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 21:36 Titel: |
|
|
Ändert leider nichts.  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 21:39 Titel: |
|
|
Komisch, bei mir klappt es ...
Ich habe den Code oben noch einmal aktualisiert. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 21:43 Titel: |
|
|
Hm, ich musste deinen Codeteil, wo die Statics definiert werden ändern, damit ich den Code kompilieren konnte:
Code: | static zeit as double = 0
static status as integer = 0
static anzeige as string*17
anzeige= "" |
Funktioniert trotzdem nicht. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 21:46 Titel: |
|
|
Code: | static anzeige as string*17
anzeige= "" |
KANN nicht funktionieren. Damit setzt du die Anzeige bei JEDEM Aufruf wieder auf Leerstring. Wenn die direkte Zuweisung nicht funktioniert (welchen fbc nutzt du???), dann lass sie weg. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 21:49 Titel: |
|
|
Ich nutze die neuste fbc-Version(0.22.0) unter Linux. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 21:52 Titel: |
|
|
Warum funktionieren dann bei dir STATIC-Anweisungen nicht, die bei meinem fbc v0.22.0 funktionieren? *wunder* _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 22.05.2011, 21:56 Titel: |
|
|
Hm, wenn ich das ="" weglasse funktioniert es, allerdings nur in deinem Beispielcode. Wenn ich es in meinem Programm verwenden möchte, müsste es so aussehen:
Code: | Sub Message(text As String,tim As Integer =300)
Dim As Integer yt=768/2-64
Dim As Integer xt=1024/2-(textl*4)
Dim As Integer cl=0
static zeit as double = 0
static status as integer = 0
static anzeige as string*17
if zeit = 0 or anzeige <> text then
zeit = timer
anzeige = text
status = 1
end if
if status = 1 then ' neu schreiben
Color RGB(255,255,cl)
Draw String(xt,yt),text
Color RGB(255,255,255)
status = 2
end if
if status = 2 and timer > zeit + 5 then ' loeschen
locate 5, 1
Draw String(xt,yt),space(len(text))
status = 0
end if
End Sub |
Allerdings bleibt die Message stehen und verschwindet nicht. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.05.2011, 22:11 Titel: |
|
|
Das ist klar, weil DRAW STRING den Hintergrund nicht löscht ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|