Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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.

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

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

...

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

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.

  • 3 Wochen später...
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 ???

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:

Der Parameter hat Typ object, du benötigst aber object[].

Also musst du nach object[] casten.

Grüße, JasonDelife.

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

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.