Threads oder Timer oder OnIdle???



  • Hallo,

    ich habe ein dialog- basierendes Programm bei dem ich Timer (3Stück) verwende:

    Timer 1: schau ob im Rs232 Buffer etwas steht (alle 500ms)

    Timer 2: Sende Daten via RS232 an versch. Schnittstellen (alle 2s.)

    Timer 3: aktualisiere das aktuelle Fenster(Dialogfenster) (alle 5s wird die Uhrzeit aktualisiert)

    Ich möchte jetzt in einem anderen Dialogfenster einen analogen I/O -Port abfragen!

    ->am analogport liegt ein Audiosignal an von dem ich den Pegel (rms- Wert) berechne.

    im Moment mache ich das auch über einen Timer, der alle 100ms den analogPort ausliest:

    void CDlgAnalogIn::OnTimer(UINT nIDEvent) 
    {
    	p_ai->sum=0;
    
    	m_ctrl_progress.SetRange(0,3000);
    	m_ctrl_progress.SetPos((int)(p_ai->ReadAnalogPort()*2000));
    	m_float_Vrms=((float)p_ai->ReadAnalogPort()*1000);
    
    	UpdateData(false);
    
    	CDialog::OnTimer(nIDEvent);
    }
    

    ...

    float CAnalogIn::ReadAnalogPort()
    {
    	//unsigned short data;
    	short data;
    	DWORD dwsamples=1;
    
    	//Effektivwert der Spannung berechnen Vrms=SQR(1/N*(xi^2))
    	//512 Samples
    	sum=0;
    	float voltage;
    
    	for (int j=0;j<128;j++)
    	{
    		ReadFile(h_analog, &data, dwsamples, &dwsamples,NULL);
    		//in V umrechnen 8Vmax -> 1bit=ca. 7,95mV
    		voltage=(data*0.00366);
    		Samples[j]=voltage;
    
    		(float)sum+=(float)((Samples[j])*(Samples[j]));
    
    	}
    
    	Vrms=sqrt(sum/128);
    

    Jetzt ergeben sich folgende Probleme:

    mach ich den Timer schnell (100ms-200ms) reagiert mein Programm nicht mehr auf die anderen Timer und Benutzer eingaben.
    Mache ich den Timer langsamer ändert sich die Pegel anzeige zu langsam!

    Ist es hier sinnvoll einen Thread zu programmieren oder bringt es nichts, da ich mich in dem Dialog befinde?

    Klingt kompliziert ist es auch...



  • Threads hätten schon bei den anderen Timern etwas gebracht.

    Ein Dialog hat damit nichts zu tun. Auch in einem Dialog gibt es Threads.
    Du solltest beachten das Timer nicht sehr genau sind. Ob ein Timer verarbeitet wird hängt immer davon ab ob ein Programm auch Zeit hat diese zu verarbeiten.
    100ms ist für einen Timer nicht geeignet. WIN kann sowieso nur in einem max. kleinsten Zeitraum einen Timer auslösen. Das hatten wir schon habe mir den aber nicht gemerkt. Liegt IMHO zw. 10 und 50 ms. Kleiner geht nicht. Ein Timer ist aber eine Nachricht die auch aus der Nachrichtenwarteschlange kommt. Wird diese nicht verarbeitet (Andere Dinge die ohne Threads gemacht werden) dann wird auch der Timer in diesem Zeitintervall nicht ausgelöst.
    Mache es mit Threads.
    Übrigens: Die Verarbeitung von Daten sollte sowieso immer getrennt vom GUI sein. GUI ist nur zur Darstellung und Eingabe.


Anmelden zum Antworten