Je développe une application en C# en utilisant National Instruments Daqmx pour effectuer des mesures sur certains matériels.Mise à jour de l'interface utilisateur avec plusieurs opérations simultanées
Ma configuration se compose de plusieurs détecteurs à partir desquels je dois obtenir des données pendant une période donnée, tout en mettant à jour mon interface utilisateur avec ces données.
public class APD : IDevice
{
// Some members and properties go here, removed for clarity.
public event EventHandler ErrorOccurred;
public event EventHandler NewCountsAvailable;
// Constructor
public APD(
string __sBoardID,
string __sPulseGenCtr,
string __sPulseGenTimeBase,
string __sPulseGenTrigger,
string __sAPDTTLCounter,
string __sAPDInputLine)
{
// Removed for clarity.
}
private void APDReadCallback(IAsyncResult __iaresResult)
{
try
{
if (this.m_daqtskRunningTask == __iaresResult.AsyncState)
{
// Get back the values read.
UInt32[] _ui32Values = this.m_rdrCountReader.EndReadMultiSampleUInt32(__iaresResult);
// Do some processing here!
if (NewCountsAvailable != null)
{
NewCountsAvailable(this, new EventArgs());
}
// Read again only if we did not yet read all pixels.
if (this.m_dTotalCountsRead != this.m_iPixelsToRead)
{
this.m_rdrCountReader.BeginReadMultiSampleUInt32(-1, this.m_acllbckCallback, this.m_daqtskAPDCount);
}
else
{
// Removed for clarity.
}
}
}
catch (DaqException exception)
{
// Removed for clarity.
}
}
private void SetupAPDCountAndTiming(double __dBinTimeMilisec, int __iSteps)
{
// Do some things to prepare hardware.
}
public void StartAPDAcquisition(double __dBinTimeMilisec, int __iSteps)
{
this.m_bIsDone = false;
// Prepare all necessary tasks.
this.SetupAPDCountAndTiming(__dBinTimeMilisec, __iSteps);
// Removed for clarity.
// Begin reading asynchronously on the task. We always read all available counts.
this.m_rdrCountReader.BeginReadMultiSampleUInt32(-1, this.m_acllbckCallback, this.m_daqtskAPDCount);
}
public void Stop()
{
// Removed for clarity.
}
}
L'objet représentant le détecteur appelle essentiellement une opération BeginXXX avec un rappel qui maintient la EndXXX en tire également un événement indiquant les données disponibles.
J'ai jusqu'à 4 de ces objets de détecteur en tant que membres de mon formulaire d'interface utilisateur. J'appelle la méthode Start() sur chacun d'eux dans l'ordre pour commencer ma mesure. Cela fonctionne et l'événement NewCountsAvailable se déclenche pour tous les quatre.
En raison de la nature de mon implémentation, la méthode BeginXXX est appelée sur le thread d'interface utilisateur et le rappel et l'événement se trouvent également sur ce thread d'interface utilisateur. Par conséquent, je ne peux pas utiliser une sorte de boucle while dans mon thread d'interface utilisateur pour mettre à jour constamment mon interface utilisateur avec les nouvelles données car les événements se déclenchent constamment (j'ai essayé). Je ne veux pas non plus utiliser une méthode UpdateUI() dans chacun des quatre gestionnaires d'événements NewCountsAvailable, car cela chargera trop mon système.
Depuis que je suis nouveau à la programmation threadée en C# je suis maintenant bloqué;
1) Quelle est la manière «appropriée» de gérer une situation comme celle-ci? 2) Mon implémentation de l'objet détecteur est-elle correcte? Dois-je appeler les méthodes Start() sur ces quatre objets de détecteur à partir d'un autre thread? 3) Puis-je utiliser une minuterie pour mettre à jour mon interface utilisateur toutes les quelques centaines de millisecondes, indépendamment de ce que font les 4 objets du détecteur?
Je n'ai vraiment aucune idée!
Quelle version de .NET utilisez-vous? –
Comment est le rappel de nidaq sur le thread UI? (sens: êtes-vous sûr?) – gimpf
Combien de données avez-vous besoin de montrer dans l'interface graphique? Parlons-nous de la vidéo? Et je commente le commentaire de Gimpf, s'il vous plaît soyez certain. –