Hintergrundprozesse!



  • Hallo zusammen!

    Ich versuche mit BCB4 ein Programm zu erstellen, dass an einem Pin der seriellen Schnittstelle einkommende Impulse zählt. Das Ansprechen der Adresse und Zählen der Impulse klappt auch (Komponente heißt DLPortIO), aber leider wird dazu fast die komplette Rechenleistung abgezogen. Das Laden anderer Programme dauert ewig, und darüber hinaus gehen auch Impulse verloren. Das ganze findet in einer Schleife statt und nur alle paar Sekunden wird die Anzahl der Impulse dargestellt. Also weniger Aufwand als die Maus!

    Wie kriege ich es hin, dass das Impulsezählen ebenso "performance-schonend" wie die Maus abläuft?

    Eigene DLL schreiben? Thread schreiben? UART der Schnittstelle auf Interrupt programmieren und mit diesen dann arbeiten?

    Sicherlich ist dieser Beitrag nicht sonderlich prägnant, aber ich hoffe, es versteht mich jemand, BITTE!!!

    🙂

    Herzlichen Dank...

    Hubi



  • Wie kommst du auf DLL?

    Welcher Art sind denn die Pulse die zu zählen sind? bzw. Welcher Pin an der seriellen?

    Ein Thread löst dein Problem nicht direkt, da ja auch der Thread rechenzeit benötigt... Trotzdem solltest du darüber nachdenken das Ganze in einen Thread zu verlagern.

    -junix



  • Zeig doch mal deine Schleife.



  • Wie ich auf DLL komme??? Gute Frage, aber irgend etwas muss ich eben ändern! Ich habe ja auch kein Programm für die Maus, zumindest ist keine exe-Datei dafür geladen!

    Ich poste mal das ganze Programm, ist ein ganz kurzes, eben noch nicht ausgearbeitet...

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Ver5Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "TDLPortIO"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool aktiv;
    int impuls,durchlauf;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    DLPortIO1->OpenDriver();
    DLPortIO1->Port[764]=1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    DLPortIO1->CloseDriver();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    if(Timer1->OnTimer)
        aktiv=false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    do
    {
        Application->ProcessMessages();
        durchlauf++;
        impuls=0;
        aktiv=true;
        do
        {
            if(DLPortIO1->Port[766]&&64==64)
                impuls++;
            Application->ProcessMessages();
        }
        while(aktiv==true);
        Label1->Caption=impuls;
        Label2->Caption=durchlauf;
        Application->ProcessMessages();
    }
    while(1!=2);
    }
    //---------------------------------------------------------------------------
    

    Die letzte Zeile (while(1!=2)) dient nur zur Wiederholung der ganzen Geschichte, denn ich weiß ja selten vorher, wann ich das Programm beende.

    Übrigens, ich nutze den RingIndicator der Schnittstelle als Impulseingang (DLPortIO1->Port[766]&&64==64) und DTR + RTS als Spannungsversorgung des Sensors (DLPortIO1->Port[764]=1).

    Natürlich hat der Code auch noch den Fehler, dass die Variable "impuls" bei einem High-Signal (die Impulse haben Frequenzen zwischen 15 und 750 Hz) rasend schnell aufaddiert, in der richtigen Fassung ist dies ausgeschlossen, aber prinzipiell tut es nix zur Sache!

    Danke und Riesen-Lob, tolles Forum, schnelle Antworten ... der Dummie-Himmel!!

    😉

    Hubi

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • Niemand eine Idee???



  • Was macht bitteschön diese Zeile im Timer?

    if(Timer1->OnTimer) 
        aktiv=false;
    


  • Damit springt er aus der inneren While-Schleife raus um die Labels mit neuen Werten zu bestücken...



  • Richtig!

    Kann man sicher auch direkt in die while-Bedingung packen.

    Noch einmal ne dumme Frage zur Maus, warum läuft die? Was ist geladen? Muss doch genauso für den Sensor möglich sein. (Spiele schon mit dem Gedanken, den Sensoranschluß umzulöten, um die Ticks, wie die Mausbewegungen, im RxD-Register abzulegen. Wie würdet Ihr denn nen eigenen Maustreiber schreiben?

    Best wishes...

    Hubi


Anmelden zum Antworten