2011-01-08 6 views
1

Ich schreibe eine GUI, die von den Endbenutzern leicht angepasst werden kann. Die Funktionen sind in C++ und werden von Lua aufgerufen. Ich versuche eine Sleep() -Funktion zu machen, die das Skript pausiert, aber nicht das Programm selbst.Sleep Lua Skript ohne das gesamte Programm zu stoppen?

Ich konnte es durch die Verwendung von Threads arbeiten und einen für jede Funktion machen. Ich möchte jedoch, dass es eine individuelle Funktion ist. Wie in, anstatt es Teil der CreateButton-Funktion und jeder anderen Funktion zu haben, einfach mit einer Delay- oder Sleep-Funktion, die nur das Skript stoppt, nicht das gesamte Programm.

Ich bin ein Neuling in Lua, ich weiß wirklich nicht, wie ich das anstellen soll. Jede Hilfe wird geschätzt.

+0

Die Antwort war eigentlich ziemlich einfach, wenn auch nicht effizient. Ich habe eine Funktion in C++ mit einer Wartezeit erstellt, und innerhalb der Warteschlange habe ich die Funktionen zum Aktualisieren der GUI ausgeführt. Ich würde trotzdem gerne hören, ob jemand eine effizientere Antwort hat. – gdi

+0

Warum möchten Sie das Skript schlafen? was willst du damit erreichen? –

+0

Entschuldigung für die späte Antwort. Ich versuche nur, eine einfache Sleep() -Funktion zu machen, die nur das Lua-Skript betrifft, nicht das gesamte Programm. Im Grunde verwendet das Lua-Skript C++ erzeugte Funktionen, die wie CreateWindow (Textur, x, y, Breite, Höhe) aussehen. RotateWindow (45) usw. Ich mache die Sleep() -Funktion so, dass wenn ich oder der Endanwender eine Pause zwischen dem Erstellen des Fensters und dem Drehen des Fensters, wir könnten es tun, ohne das gesamte Programm zu unterbrechen. – gdi

Antwort

1

Ich würde in die Herstellung einer Zustandsmaschine mit Korotinen und Message-Passing aussehen. Behandle jeden Tastendruck wie eine C++ - Zeichenkette, die in die Coroutine-Fortsetzung übernommen wird. Sie können dann eine kleine Zustandsmaschine erstellen, die die Nachricht einschaltet. Sie können dann einige UI-Arbeiten ausführen und die Coroutine wieder in den Ruhezustand versetzen, bis etwas eine andere Nachricht sendet.

Das ist ziemlich praktisch, wenn Sie einen Zustandsautomaten haben, der UI ausführt.

Pseudocode:

c_obj:wait_for_message("mouse_down"); 
local message = coroutine.yield(); 
if(message == "mouse_down") then 
    update draw function. 
end 
c_obj:wait_for_message("mouse_up"); 
local message = coroutine.yield(); 
if(message == "mouse_up") then 
    Update UI.. 
    update draw function. 
end 
etc... 
0

Um Ihre busy-waiting-Lösung effizienter zu machen, wie wäre es mit select() oder ähnlichem, auf einige GUI-Ereignisse zu warten, anstatt sie zu drehen? Es scheint, als ob Sie etwas in der GUI tun müssten, unabhängig von der Scripting-Seite der Dinge.

Verwandte Themen