Question

Avoir des problèmes avec le segment de code suivant. Je reçois une incompatibilité entre les paramètres

J'ai dû écrire ceci en raison de problèmes liés à plusieurs threads et à des mises à jour non sécurisées.

       delegate void data_INPUTDelegate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e);
    private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string data = serialPort.ReadLine();

        string[] tokens = data.Split(':');
        if (tokens[0] == "$SENSOR")
        {
            if (label_sensorValue.InvokeRequired)
            {
                data_INPUTDelegate del = new data_INPUTDelegate(data_INPUT);
                label_sensorValue.Invoke(del,new object[] {tokens[1]});
            }
            else
            {
                label_sensorValue.Text = tokens[1];
            }
        }
    }
Était-ce utile?

La solution

Je suppose que l'erreur vient de cette ligne:

label_sensorValue.Invoke(del,new object[] {tokens[1]});

Vous ne transmettez qu'un seul paramètre à del ( jetons [1] ), mais il comporte deux paramètres (expéditeur et e)

EDIT: après avoir lu attentivement votre code, je vous suggère de créer une méthode SetSensorValue pour définir la valeur de label_sensorValue . À l’heure actuelle, vous essayez d’appeler le gestionnaire d’événements avec des paramètres incorrects.

private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string data = serialPort.ReadLine();

    string[] tokens = data.Split(':');
    if (tokens[0] == "$SENSOR")
    {
        SetSensorValue(tokens[1]);
    }
}

delegate void SetSensorValueDelegate(string value);

private void SetSensorValue(string value)
{
    if (label_sensorValue.InvokeRequired)
    {
        SetSensorValueDelegate del = new SetSensorValueDelegate(SetSensorValue);
        label_sensorValue.Invoke(del, new object[] {value});
    }
    else
    {
        label_sensorValue.Text = value;
    }
}

Autres conseils

Votre problème est que vous appelez un délégué à deux paramètres avec un seul paramètre.

La ligne suivante

label_sensorValue.Invoke(del,new object[] {tokens[1]});

appelle le délégué sur le thread d'interface utilisateur avec le paramètre jetons [1] .

Le délégué ayant besoin de deux paramètres, il échoue. De plus, le délégué attend un objet et un SerialDataReceivedEventArgs , et non une chaîne.

Pour résoudre ce problème, vous devez appeler une méthode anonyme au lieu du délégué.

Par exemple (en C # 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top