Problem beim Maximieren



  • Hallo,

    ich habe einen Task die über die Serielle Schnittstelle Daten empfängt und einen der Daten sendet (115200 KBit/s).
    Der Task der Daten empfängt benutzt Readfile im OVERLAPPED Modus und wartet danach mit WaitForSingleObject auf das empfangsevent

    In dem Moment wo ich mein Fenster Maximiere dauert es 500 ms bis mein Empfankstask wieder drankommt und somit mein Kommunikationstimeout zuschlägt, da ich maximal 500 ms auf eine Antwort warte. Die Daten werden aber von der Seriellen Schnittstelle empfangen, ich habe mich mit einem weiteren ComPort mit auf die serielle Schnittstelle zum "schnüffeln" mit angehängt.

    Warum dauert das zeichnen des Forms so lange?
    Und wie kann ich es anstellen das der Task zwischendrin mal seine Daten verarbeiten kann (die Thread Priority auf THREAD_PRIORITY_TIME_CRITICAL setzen ändert nichts, da es ja um die Abarbeitung des Empfangseventes geht)?

    MfG



  • Hat keiner eine Idee?



  • Hallo,

    Lagere doch den Empfangstask in einen Thread aus, dann wird nichts blockiert (siehe BCB-Hilfe zu TThread oder Builder Tutorial)



  • Ich hatte mich oben verschrieben ich meinte das Empfangen ist ein eigener Thread nur leider kommt der nicht dran so lange maximiert wird.

    Woran könnte das liegen?

    MfG



  • Wenn der Empfangstask in einem eigenen Thread liegt kann das maximieren der Form da eigentlich nichts blockieren, es sei denn du hälst deinen Thread selber vorher an. Wie rufst du deinen Thread denn auf?



  • das habe ich ja auch gedacht das da nichts blockieren kann ist ja auch nur so lange wie maximiert wird weshalb auch immer das so lange dauert.

    {
    // Event anlegen
    memset(&ov,0,sizeof(ov));
    ov.hEvent = CreateEvent(NULL,false,true,NULL);
    
    // Thread
    while (!ThreadExit)
    {
     Port offen?
     if (INVALID_HANDLE_VALUE != hComPort)
     {
      // Empfangsevent?
      if (WAIT_OBJECT_0 == WaitForSingleObject(ov.hEvent,500))
      {
       if (GetOverlappedResult(hComPort,&ov,&br,false))
       {
        for (i = 0;i < br;i++) ReceiveEvent(Buffer[i]);
       }
       // Daten lesen
       ReadFile(hComPort,Buffer,sizeof(Buffer),&br,&ov);
      }
     }
     else
     {
      // Event setzen
      SetEvent(ov.hEvent);
      // warten
      Sleep(100);
     }
    }
    
    // Event löschen
    CloseHandle(ov.hEvent);
    
    // Flag löschen
    ThreadRunning = false;
    }
    

    ich denke das solange das programm maximiert wird das event nicht gesetzt wird und dadurch der thread nichts macht weiß aber nicht wie ich das ändern kann.

    den thread rufe ich mit der WinApi Funktion CreateThread.

    Wieso sollte der Aufruf einen Fehler verursachen?



  • Mit WinAPI-Threads kenne ich mich nicht aus. Evtl. fragst du mal im dortigen Forum nach.


Anmelden zum Antworten