Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:24

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Multi-Threading unter Delphi?
BeitragVerfasst: Mo Jul 11, 2005 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Wie schon das Topic sagt: wie geht das?
In meinen Büchern wurde leider ein groooooooooooooooooßer Bogen um dieses Thema gemacht.
Das ist doch sicher ähnlich wie in Visual C++?

Über kurze Erläuterungen/Bsp.-Code wäre ich sehr dankbar :-)


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 11, 2005 13:06 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
http://www.dsdt.info/tutorials/threads/?page=3

oder hier auf der Seite!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 11, 2005 13:11 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
z,B. dies? http://www.delphigl.com/script/do_show.php?name=multithread&action=2

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 12, 2005 12:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
jo thx habs erstmal überflogen sieht aber gut aus :-)

hatte mein Glück erst mit der Suchen-Funktion im Forum um "thread" geamcht, da kamen aber 8 oder 9 Seiten und sons wieviel Themen die nichts an sich damit zu tun hatten deswegen das extra Thema ... .

THX fürs antworten :-)


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 12, 2005 12:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
hab mal noch ne Frage zum Synchronisieren: kann man auch irgendwie ein Objekt synchronisieren in Delphi? In den Tutorials steht das nur im Bezug auf Methoden/Funktionen.

Ich brauch sowas nämlich weil: ich hab nen TPanel da läuft ne Animation ab(per OpenGL). Die Daten dazu liegen in einer selbst geschriebenen Datenbasis. Diese wiederrum benutzt ne dynmische Liste für die Grafikobjekte.
Nun möchte ich, während die Animation im Panel abläuft, per Maus oder Tasten die Kameraposition ändern können. Nun wäre es natürlich nicht so gut, wenn die Animation die Datenbasis zur Hälfte erst verändert hat und in dem Monment wird die Kameraposition geändert und es findet ein Neuzeichnen statt ... .

Daher wäre es ja praktisch wenn man die Datenbasis snychronisieren könnte.


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 12, 2005 13:01 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
In dem Fall brauchs du Multithreading überhaupt nicht. Üblicherweise, würde man die Daten auslesen + entsprechend zeichnen, dann UserInput abfragen (Mouse hat sich bewegt, Taste gedruckt), dem (UserInput) entsprechend reagieren, dann wired ma Anfang und soweiter...
Code:
  1. while doing_some_stuff do
  2. begin
  3.   daten_lesen;
  4.   daten_zeichnen;
  5.  // moglicherweise -> daten_lesen_und_zeichnen;
  6.   process_input;
  7. end;

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 12, 2005 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ahhh. Was ist denn das schon wieder ne Whileschleifen?

Du kannst dafür eine ganz stink normale Renderschleife verwenden. Also so etwas wie OnIdle. Wenn es etwas CPU schonenderes sein soll kannste auch nen Timer mit nem entsprechenden Interval verwenden. Wenn du willst kannst du auch nur bei Bedarf zeichnen. Also wenn sich etwas ändert oder es gemalt werden muss. Ist je nach Fall wohl auch die eleganteste Alternative. Der Phantasie bleiben keine Grenzen gesetzt.

Aber prinzipiell hat sniper recht. Da sehe ich keine große Notwenigkeit für Threads. Vor allem da man aus der kleinen Beschreibung leider nicht so sonderlich gut erkennen kann was du wie wo und warum machst. Das ist Bei Threads leider unumgänglich, da Timing und Aufrufe sehr häufig eine ausschlaggebende Rolle spielen.

Wie schon gesagt. Ich sehe da auf den ersten Blick keine Notwendigkeit dafür das mit Threads zu gestalten. Die bringen oftmals nen ganzen batzen Probleme mit sich.

Anmerkung zum Synchronisieren. Du kannst spezielle Blöcke zum Beispiel durch eine Critical Section schützen. Oder mit dem Synchronize. Aber das habe ich bereits im Tutorial geschrieben. Dort unter "Synchronschwimmen" unter dem rotem Text. Mehr kann man dazu wohl auch nicht mehr sagen. Und Beispiele sind auch schon mit drin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 08:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Timer hab ich auch schon überlegt, aber der hat ja eine geringe Nachrichtenpriorität, daher befürchte ich das die Animation daher in der Geschwindigkeit leicht "schwanken" könnte, aber vielleich teste ich das einfach mal, vielleicht ist es ja doch nicht so schlimm wie ich mir das vorstelle.

Das Prinzip der Schleife habe ich mir auch schon überlegt, aber: das Panel befindet sich auf einer TForm, wo sich weitere Buttons befinden(u.a. die für die Kamerabwegeung). Zweite Eingabemöglichkeit für die Kamera ist halt die Maus(per MousDown und MouseMove ...).
Wenn ich jetzt die Methode für die Animation starte, müsste ich ja von da "drinnen" irgendwie überprüfen können, ob halt Maus bewegt oder ein Button gedrückt. wurde. Geht das so einfach unter Delphi ohne das man zu sehr in die WinAPI einsteigen muss?

Und was meinst du mit OnIdle?


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 09:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Durch Application.ProcessMessages() kannst du deinem Programm sagen, es soll erstmal gucken ob sonst noch anfragen reinkommen die bearbeitet werden sollen (Maus/Tastatur) und dann erst die schleife neu starten.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich persönlich finde die Möglichkeit mit der "never ending Schleife" alles andere als optimal. Delphi oder besser die VCL ist Eventbasierend und bei solch einer Schleife bleibt er permanent in einer Methode stecken und polled alle paar Millisekunden nach externen Events. Abgesehen davon, dass er extrem viel mehr tut als er eigentlich müsste habe ich häufiger schon gesehen, dass es immer wieder zu Problemen verschiedenster Art führt. Und ich halte es für zu unsauber um in einer Objekt orientierten Umgebung existieren zu dürfen. Aber das ist meine Meinung.

Aber um das Problem richtig einschätzen zu können müssten wir schon wissen was "die Animation" eigentlich genaues macht und wichtiger wo es denn den zum Einsatz kommen soll. Anderfalls können wir dich nur mit Ideen zuwerfen und du musst selber herrausfinden was das Beste für dich ist. Ob das der sinnvollste Weg ist lasse ich mal im Raum stehen.

@Tastaturevents, Maus: Auch hier gibt es je nach Anwendungfalls verschiedene Möglichkeit. Entweder du benutzt OnKeyDown, OnKeyUp, OnMouseDown, OnMouseUp und OnMouseMove oder du fragst die Werte direkt bei den Geräten ab. Wenn die Anwendung in der Lage ist Messages abzuarbeiten (was durch Application.ProcessMessages hingebogen wird) dann werden die Events aufgerufen und du könntest darin zum Beispiel deine Ansicht verändern. Also Variablen dafür die du zum Rendern benutzt. Bei der Nachfragemethode musst du halt beim Renden nachfragen und entsprechend dann deine Werte ändern.

@OnIdle: Das dürfte sich auch im Template befinden. Da wird das Event Application.OnIdle zugewiesen und das wird dann immer aufgerufen wenn die Anwendung mal nichts zu tun hat. Dort existiert ein Parameter (Done) wenn du diesen auf false setzt wird OnIdle permanent aufgerufen. Darin kannst du dann ein Bild rendern und alle anderen Events funktionieren ohne Getrickse. OnIdle wird nicht aufgerufen, wenn das Fenster verschoben oder in der Größe geändert wird. Da es sich dabei um eine Message handelt wird es auch nicht aufgerufen solange die Anwendung in einer Methode steckt. Sofern diese nicht dafür sorgt, dass die Messages per Hand abgearbeitet werden. (ProcessMessages)


Oh. Mein Gott. Sehe gerade den ersten Satz meines letzten Postings. Was habe ich denn da genommen um so nen Stuss zu schreiben. :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
"die Animation" macht folgendes: Ich habe einen Brenner und ein Rohr, der Brenner fährt gewisse Bewegungen ab und erzeugt Linien, welche sozusagen die Schnitte darstellen. Bewegen kann sich hierbei der Brenner, aber auch das Rohr mit allen bisher erzeugten Linien. Die Bewegung des Brenners und des Rohres lese ich aus einer Datei ein. Da stehen die Bewegungen nacheinander drinnen.
Und während sich nun der Brenner und/oder das Rohr da bewegen und so die Grafik aufbauen, möchte ich halt gleichzeitig die Kamerasteuerung anwender- gesteuert lassen, sodass das also abläuft und ich als Zuschauer das sozusagen von allen Seiten anschauen kann wie ich möchte.

Da die Datei natürlich irgendwann zu Ende ist wäre es kein richtige Endlosschleife, aber ich weis was du im Prinzip damit meinst. Daher wollte ich das ja auch nicht so gern machen und kam auf die Idee die Animation in einem Extrathread laufen zu lassen, und während der Nutzer weiter auf der Form per Maus und/oder den vorhandenen Buttons die Kamera ändern kann.

Dazu müsste ich aber dafür sorgen, dass sich Schreiben beim Ändern der Objekte und Lesen beim Neuzeichnen nicht in die Quere kommen. Die Objekte sind natürlich letztendlich in Displaylisten vorhanden, aber man stelle sich vor in der Anmiation wir eine Displayliste grade neu geschrieben und bevor das fertig ist, will das Neuzeichnen diese lesen ... kA was da passiert ich will es net unbedingt herausfinden^^ Daher die Frage weiter oben, ob ich Objekte synchronisieren kann, weil das Zeichen und Ändern der Objekte beides in meiner Datenbasis(ist eine Klasse) stattfindet.

Ich hoffe es kommt halbwegs rüber was mein Anliegen ist, wenn nicht bitte einfach wieder nachfragen. :-)


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 14:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na das nenne ich doch mal ausführlich. Danke. Jetzt habe ich auch verstanden was dein Problem ist. Rendern in einem extra Thread und dabei auf Benutzerinteraktionen einzugehen ist alles andere als einfach. Sehr viel zum Synchronisieren und beim kleinsten Fehler gibbet Haare Probleme. Deswegen würde ich empfehlen nicht in einem extra Thread zu rendern. Und du kannst auch nicht aus zwei verschiedenen Threads mit OpenGL rendern. Also auf den gleichen RC. Das muss meines wissen nach immer ein und der selbe Thread sein. Sonst macht er in dem Anderen nichts.

Mein Vorschlag wäre also der Folgende. Rendere in dem OnIdle deine Animation mit Timebased Movement. Rotationen kannst du per Maus oder evtl. per Buttons verarbeiten. Zum Rendern würde ich keine Displaylisten benutzen, da das generieren der Listen wahrscheinlich schon fast länger dauert als die Listen eigentlich existieren werden. Zwecks ändernder Animation. Fixe Objekte wie den Brenner würden sich allerdings schon als Liste anbieten. Sofern sie halt fix sind. Daran ändert sich ja dann nichts. Je nachdem was du hast kannst du dir auch mal die VBOs (Vertex Buffer Objects) anschauen. Die sind für variable Objekte gemacht.

Ich habe jetzt allerdings auch keine Ahnung wie groß deine Animation sein wird und um wie viele Daten es sich handelt. Sollten es aber weniger als 50-100MB sein kannst du diese eigentlich auch direkt am Start laden. Aber dabei nur die Informationen. Das generieren der VBOs müsstest du dann sowieso je nach Animationsschritt vor dem Rendern machen. Evtl könntest du dafür auch einen Thread implementieren. Der könnte da evtl. auch die Daten von Festplatte laden und würde in diesem Falle gleich den kompletten Speicherbereich des Animationsschritt erzeugen. Also direkt das was im Endeffekt in den Speicher des VBOs kopiert werden würde. Dies würdest du also in dem Thread generieren und hängt die Speicherbereiche (je nach größe und Animationsgeschwindigkeit 10-50) in eine queue. Also eine Liste.

Zum Rendern würdest du hergehen. Den Speicher am Stück in das VBO kopieren und aus der Liste entfernen. Und schön hättest du einen neuen Schritt der Animation und der Thread würde dich kontinuirlich mit Neuen versorgen. Als Liste könntest du eine TThreadList verwenden. Die ist schon entsprechend geschützt auf das sich die zugreifenden nicht in den Weg kommen. Was aber normal auch nur recht kurz sein sollte. Also Hinzufügen und entfernen eines Eintrages (Pointer). Der Ladethread würde entsprechend alle 20-100 ms naschauen ob schon wieder ein neuer Schritt benötigt werden würde und das wäre es eigentlich.

Wie gesagt das lohnt sich meiner Meinung nach nur bei großen Datenmengen. Solte es sich um sehr kleine Datenmängen halten könntest du das auch vor dem Rendern eines Bildes machen. Bei bedarf versteht sich. Ich hoffe das war nicht zu kompliziert.

Hier ein kleines Beispiel für die Interaktion mit der Maus. Okay. Was heißt klein. Die Steuerung mit der Maus wird auf 3 privaten Variablen der Klasse TForm1 übertragen und beim Rendern wird der Drehbereich begrenzt (Links recht oben und Unten) und in der Mitte bei 0 ist ein kleiner Raster (TempRotateY) eingebaut. Der Sogt dafür, dass man recht einfach wieder auf denn Nullpunkt zurückgkehren kann, ohne genau wissen zu müssen wo man sich befindet. Die Begrenzung auch deswegen, da es sonst zu verwirrend wäre wenn man sich sonst wohin drehen könnte. Zoomen in einem bestimmten Bereich gibt es natürlich auch. ;-)
Code:
  1.   TForm1 = class(TForm)
  2.   ...
  3.   private
  4.     FMouseMove: Boolean;
  5.     FMousePos: TPoint;
  6.  
  7.     // Vars to Render
  8.     FRotateX: Single;
  9.     FRotateY: Single;
  10.     FZoom: Single;
  11.  end;
  12.  
  13. implementation
  14.  
  15. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  16.   var Done: Boolean);
  17. begin
  18.   Done := False;
  19.  
  20.   DrawScene;
  21.  
  22.   SwapBuffers (FDC);
  23. end;
  24.  
  25. procedure TForm1.DrawScene;
  26. var
  27.   TempRotateY: Single;
  28. begin
  29.   ...
  30.   if (FMouseMove) then begin
  31.     // MouseRotation
  32.     if (FRotateY > 90)
  33.       then FRotateY := 90
  34.       else
  35.     if (FRotateY < -90)
  36.       then FRotateY := -90;
  37.  
  38.     if (FRotateX < -85)
  39.       then FRotateX := -85
  40.       else
  41.     if (FRotateX > 0)
  42.       then FRotateX := 0;
  43.  
  44.     if FZoom < 0.1
  45.       then FZoom := 0.1
  46.       else
  47.  
  48.     if FZoom > 3
  49.       then FZoom := 3;
  50.   end;
  51.  
  52.   if (FRotateY > -10) and (FRotateY < 10) then begin
  53.     if (not FMouseMove)
  54.       then FRotateY := 0;
  55.     TempRotateY := 0
  56.   end
  57.     else TempRotateY := FRotateY;
  58.  
  59.   glScalef(FZoom, FZoom, FZoom);
  60.  
  61.   glRotatef(FRotateX, 1, 0, 0);
  62.   glRotatef(TempRotateY, 0, 0, 1);
  63.  
  64.   // Rendern
  65. end;
  66.  
  67.  
  68. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  69.   Shift: TShiftState; X, Y: Integer);
  70. begin
  71.   if ((Button = mbLeft) or (Button = mbRight)) then begin
  72.     FMouseMove := True;
  73.     FMousePos.X := X;
  74.     FMousePos.Y := Y;
  75.  
  76.     Mouse.Capture := Handle;
  77.   end;
  78. end;
  79.  
  80.  
  81. procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  82.   Shift: TShiftState; X, Y: Integer);
  83. begin
  84.   FMouseMove := False;
  85.   Mouse.Capture := 0;
  86. end;
  87.  
  88.  
  89. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  90.   Y: Integer);
  91. begin
  92.   if FMouseMove then begin
  93.     if GetAsyncKeyState(VK_LBUTTON) <> 0 then begin
  94.       FRotateX := FRotateX + ((Y - FMousePos.Y) / 5);
  95.       FRotateY := FRotateY + ((X - FMousePos.X) / 5);
  96.     end;
  97.  
  98.     if GetAsyncKeyState(VK_RBUTTON) <> 0 then begin
  99.       FZoom := FZoom + (((Y - FMousePos.Y) + (X - FMousePos.X)) / 100);
  100.     end;
  101.  
  102.     FMousePos.X := X;
  103.     FMousePos.Y := Y;
  104.   end;
  105. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 14:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
du willst aber doch hoffentlich nicht displaylisten zur laufzeit updaten, oder?
das ist nämlich nicht grad performant, informier dich lieber mal über VBOs.

Für deinen Zweck würde ich ansich auch (ausser vll. zum üben ;)) von Multithreading abraten und wie schon erwähnt zum rendern das oneventsidle benutzen. Dadurch werden benutzereingaben immernoch korrekt mit priorität verarbeitet, die Prozesse laufen aber immernoch geordnet nacheinander ab, wodurch die synchronisation entfällt. problematisch bei dieser methode wär nur, wenn die Verarbeitungszeit der eingaben derart lang ist, dass es deutlich merkbar zeit kostet, in welchem fall es natürlich besser im hintergrund verarbeitet werden würde. allerdings ist ogl iirc nicht threadsave weshalb ogl zugriffe allgemein in einem thread stattfinden sollten, also nicht ein thread schreibt die listen und einer zeichnet sie.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 13, 2005 15:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Also erstmal ein großes Danke für die Hilfe, das mit mit EventIdle klingt wirklich ganz gut.

Mit der Rotation handhabe ich das ein bisschen anders. Ich habe eine Struktur, die diverse Daten zum Grafikzustand enthält,
u.a. den Szenenmittelpunkt und den Blickpunkt. Wenn ich rotiere, drehe ich einfach meinen Blickpunkt um den Szenenmittelpunkt
und wenn man die Ansicht für OpenGL in einem neuen Durchlauf setzt, wird halt immer der Blickpunkt genommen, der sich in der
Struktur befindet. Ist bestimmt weniger effektiv als wenn ich direkt OpenGL dafür benutze, aber ich habe volle Kontrolle über meine Ansicht.
Das nur nebenbei.^^

Wegen den Displaylisten: Ich gebs zu die wollte ich tatsächlich verwenden,weil: ich habe momentan eine funktionierende Datenbasis + Klassen
für die benötigten grafischen Objekte aus einem anderen Projekt. Dort war nichts dynamisch im Sinne einer Animation, die Funktionalität hatte ich aber schon in die Klassen implementiert(also verschieben,rotieren,usw.). Also wie ein kleines CAD-System, und dort verwende ich Displaylisten. Und bei diesem Projekt wollte
ich die vorhandenen Klassen einfach verwenden. Allerdings ist der Einwand natürlich richtig, dass das nicht sehr effektiv ist. Mit den VBOs das klingt ganz interessant, werd ich mir auf jeden Fall anschauen. also nochmal THX :-)


MfG Pellaeon.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 14, 2005 19:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
eine Frage zu Threads hätte ich noch^^

Wie kann ich die Anwendung aus einem Extra-Thread beenden? "Halt" bringt mir ne Exception. Dann habe ich mir eine Referenz auf "Applictaion" geholt und es mit "Terminate" versucht, da passiert aber einfach nix.


MfG Pellaeon


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]