Oxy Geschrieben 19. Oktober 2009 Geschrieben 19. Oktober 2009 Hallo , ich habe das Problem das , dass ich auf einen Button klicke und ich will erst nach 30 Sekunden das eine bestimmte Methode aufgerufen wird . Bsp.: Ich klicke auf den Button aber erst nach 30 Sekunden soll eine PictureBox geaddet werden . Ich habe schon verschiedene Ansaätze probiert mit z.B. private void delay() { int mySec = DateTime.Now.Second; if (mySec < 30) mySec += 30; else mySec -= 30; int prog = DateTime.Now.Second; prog++; do { if (prog == DateTime.Now.Second) { if (prog == 60) prog = 0; progressBar1.Value++; prog++; } } while (mySec != DateTime.Now.Second); progressBar1.Value = 0; } Dies funktioniert auch jedoch kann ich während dieser 30 Sekunden keine Interaktionen ausführen , sondern erst nach den 30 Sekunden. Ich habe auch Probiert einen Timer zu starten beim Button klick ,einen Wert hochzuzählen und in einer While -Schleife auf != 30 abgefragt aber er macht keien Timer_Ticks während er die Schleife bearbeitet. Dann dachte ich mir ich nutze Threads , doch ich will die Picturebox in einer Matrix ("Jedes Element wird in einem Quadranten in der Matrix gespeichert , um zB. die Koordinaten , der neben an liegenden Quadranten zu erfahren , um dort die Picturebox zu adden")speichern und von daher muss ich beim Thread start die Matrix übergeben . Ich habe mich an folgendem versucht : class MyThread { Thread Thread; public MyThread(Matrix mX) { //Diese Zuweisung funktioniert nicht !! this.Thread = new Thread(new ParameterizedThreadStart(AddSoldierThread)); this.Thread.Start(mX); } public static void AddSoldierThread( Matrix mix) { //Hier soll eine Zwitschleife hin und nach der will ich auf die Matrix zugreifen //Zugriff auf die Matrix } Jedoch bekomme ich Folgenden Fehler : Fehler 1 Keine Überladung für "AddSoldierThread" stimmt mit dem Delegaten "... Ich habe bei 2 Foren , genau sowas gefunden aber Irgendwie mache ich einen Fehler oder . Fals jmd eine Bessere Idee hat dies zu realisieren Bitte ich auch um Antwort .I MfG Oxy Zitieren
Gateway_man Geschrieben 19. Oktober 2009 Geschrieben 19. Oktober 2009 Muss man denn nicht noch beim Thread Adressof angeben? Ich habs jetzt in vb geschrieben, welches wie folgt aussieht : Dim thr As New Threading.ParameterizedThreadStart(AddressOf holy) Me.Invoke(thr, "hallo") End Sub Public Sub holy(ByVal name As String) MsgBox(name) End Sub Allerdings weiß ich wie gesagt nicht ob man bei C# noch den Adressof parameter benötigt. Zitieren
Pointerman Geschrieben 19. Oktober 2009 Geschrieben 19. Oktober 2009 Moin! Der Timer sollte schon ein guter Ansatz gewesen sein. Zeit auf (in Deinem Beispiel ) 30s setzen und in dem Tick-Eventhandler Deine Add-Methode aufrufen. Ein Beispiel, bei dem durch den Druck auf einen Button der Timer gestartet wird. Nach der angegebenen Zeit wird dann eine Messagebox mit "Hallo" ausgegeben und der Timer gestoppt, damit der Tick nicht immer wieder ausgefuehrt wird. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace timertest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { MessageBox.Show("Hallo"); timer1.Stop(); } private void button1_Click(object sender, EventArgs e) { timer1.Start(); } } }[/PHP] Ist nicht schoen und die Namensgebungen sind mies, aber es ist ein funktionierendes Beispiel. Zitieren
Oxy Geschrieben 19. Oktober 2009 Autor Geschrieben 19. Oktober 2009 Hallo, und danke für die shcnellen Antworten @Gate : Also ich habe es ausprobiert und das ist nicht die Ursache und laut MSDN muss ich auch keine Adresse übergeben . Aber Danke. @Pointer : Erstma : Danke sehr ! Das ich auf Sowas triviales nicht gekommen bin xD Ich habe nun einen Timer der eine Variable jede Sekudne hochzählt und wenn die Value 30 ist soll er meine Methode starten und dann den Wert reseten und den Timer stoppen . Jedoch scheint mir das du den Timer erst nach 30 Sekunden startest wenn ich das richtig verstanden habe . Wie will ich den Timer auf 30 Sekunden stellen ? ich habe die Timer bisher nur mit dem Intervall 1000ms = 1 Sekunde gesetzt ? Fals jmd trotzdem weiss wie das mit dem Thread funktioniert wäre ich trotzdem nicht abgeneigt eine Antwort zu kriegen , da ich früher oder später nicht drum rumkommen befürchte ich . MfG Oxy Zitieren
Pointerman Geschrieben 19. Oktober 2009 Geschrieben 19. Oktober 2009 [q]Jedoch scheint mir das du den Timer erst nach 30 Sekunden startest wenn ich das richtig verstanden habe . Wie will ich den Timer auf 30 Sekunden stellen ? ich habe die Timer bisher nur mit dem Intervall 1000ms = 1 Sekunde gesetzt ?[/q] Ich verstehe Deine Frage nicht so ganz. Hast Du Dir mal die Hilfe zu Intervall angesehen? Da steht, dass Du den Intervall auf Deine gewuenschte Dauer stellst und in Deinem Fall waeren das dann 30000 fuer 30*1000ms. Dann musst Du nicht immer den Wert/Intervall pollen. Das ist ja die Idee hinter dem Timer. Zitieren
Oxy Geschrieben 19. Oktober 2009 Autor Geschrieben 19. Oktober 2009 ... Ich glaub ich mach heut früher Feierabend ...:schlaf: Das ich den Timer auf 30000 setzen kann kam mir garnicht in den Sinn . Das liegt wohl daran das ich die Timer immer mit 10000,1000,100,10 genutzt habe . Das du die Frage nicht verstandest hast liegt wohl daran das sie einfach nur Hohl war .:bimei Nochmals Danke MfG Oxy Zitieren
0815FIA Geschrieben 19. Oktober 2009 Geschrieben 19. Oktober 2009 ParameterizedThreadStart benötigt ein object als Parameter. Also einfach dein Matrix Objekt in object casten, mit ParameterizedThreadStart übergeben (die aufgerufene Methode sollte natürlich praktischerweise einen object Parameter erwarten), und in der aufgerufenen Methode wieder in Matrix casten. Fertig ist die Laube. Zitieren
GreatOne Geschrieben 6. November 2009 Geschrieben 6. November 2009 ParameterizedThreadStart benötigt ein object als Parameter. Hab gerade das gleiche Problem und das Problem liegt bei: ParameterizedThreadStart benötigt ein object als Parameter -> ich benötige aber einen 2 Parameter ??? Zitieren
GreatOne Geschrieben 6. November 2009 Geschrieben 6. November 2009 Hab es mit einem Array Object probiert. Das heißt mehrere Parameter in ein object gespeichert. Aber beim Auslesen mit folgenden Code: arrayObject[0] bzw. arrayObject[1] bekomme ich folgende Fehlermeldung: "Indizierung mit [] kann nicht auf den Ausdruck vom Typ object angewendet werden"! Wenn ich mir das arrayObject im Debugger ansehe, werden aber beide Werte einwandfrei übergeben und gespeichert- irgendwie muss man die da ja auch wieder auslesen können Zitieren
JasonDelife Geschrieben 6. November 2009 Geschrieben 6. November 2009 Der Parameter hat Typ object, du benötigst aber object[]. Also musst du nach object[] casten. Grüße, JasonDelife. Zitieren
GreatOne Geschrieben 7. November 2009 Geschrieben 7. November 2009 danke soweit - leider gleich das nächste Problem: also hier wird das Array Objekt "ipport" übergeben ipport[0] = server; ipport[1] = servPort; Thread client = new Thread(newParameterizedThreadStart(newClient().FetchFileFromServer)); client.Start(ipport); -> und hier übernommen: public void FetchFileFromServer(object ipport){ ...} wenn ich das so mache gibt es keinen Fehler. Wenn ich es allerdings so mache public void FetchFileFromServer(object[] ipport){ ...} dann bekomme ich folgenden Fehler: Keine Überladung für FetchFileFromServer stimmt mit dem Delegaten System.Threading.ParametrizedThreadStart überein. und wenn ich hier ipport übergebe: Thread client = new Thread(newParameterizedThreadStart(newClient().FetchFileFromServer(ipport))); dann bekomme ich die Fehlermeldung: Methodennamen erwartet :upps Zitieren
JasonDelife Geschrieben 7. November 2009 Geschrieben 7. November 2009 Du sollst auch nicht die Methodensignatur ändern, sondern casten. Was casten ist solltest du doch wissen, wenn nicht: Let me google that for you Grüße, JasonDelife. Zitieren
GreatOne Geschrieben 7. November 2009 Geschrieben 7. November 2009 Danke! Natürlich weiß ich was casten ist, aber auf das muss man erstmal kommen, dass man ein object-Array übergibt, aber in der Methode ein object entgegennimmt und dann in ein object-Array castet. Normalerweise würde man halt auch ein object-Array entgegennehmen :upps Wie auch immer, thx für die Hilfe :uli Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.