Zum Inhalt springen

Thread Parameter Übergabe


Oxy

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

[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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

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 :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...