Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Text 5 Sekunden anzeigen(Timer zurücksetzen)
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 22.05.2011, 18:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 19:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 19:13    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 19:43    Titel: Antworten mit Zitat

Westbeam hat Folgendes geschrieben:
@nemored
Die FB-Zeichenfunktionen sind nicht Threadsicher...

Dann mache sie thread-save. Wozu gibt es MUTEXLOCK und diese Dinge? zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 19:49    Titel: Antworten mit Zitat

zeit ist nicht mehr gleich tim, weil zeit ja auf 0 gesetzt wird, bevor die Sub verlassen wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 20:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 20:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 20:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 20:36    Titel: Antworten mit Zitat

Und wie löse ich das, dass die Message in meinem Programm dann nur einmal angezeigt wird?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 21:06    Titel: Antworten mit Zitat

Durch Probieren und rumfeilen grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 21:17    Titel: Antworten mit Zitat

Hm, zumindest bei mir funktioniert dein Code nicht. Die Message bleibt da stehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 21:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 21:36    Titel: Antworten mit Zitat

Ändert leider nichts. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 21:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 21:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 21:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 21:49    Titel: Antworten mit Zitat

Ich nutze die neuste fbc-Version(0.22.0) unter Linux.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 21:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 22.05.2011, 21:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.05.2011, 22:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 2 von 4

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz