Re: Probleme beim Debuggen

From: Foxi (vokuit00_at_service-profis.de)
Date: 07/07/04


Date: 6 Jul 2004 22:18:51 -0700


:-)) Mein Gott, das ihr alles so genau wissen müßt :-))

Also es geht um eine CANCardXL der Firma Vector Informatik. Ein Kanal
dieser Karte ist mit einem CAN-Bus verbunden und empfängt dort
CAN-Botschaften von KFZ-Steuergeräten. Der zweite Kanal ist eine
Digital/Analog-Ein-/Ausgangskarte und mißt verschiedene Signale von
diesen Steuergeräten.

In C habe ich die Funktionen von VB, die via Callback aufgerufen
werden sollen als typedef wie folgt ausgeführt:

// Callback-Funktion, um empfangene Messages an VB zu übergeben
typedef void (__stdcall *sendMessage) (struct s_xl_can_msg *,
unsigned __int64 *);

// Callback-Funktion um Probleme an VB weiterzumelden
typedef void (__stdcall *VektorProblem) (int problem);

// Callback-Funktion, um gemessene DAIO-Daten an VB zu übergeben
typedef void (__stdcall *sendDAIO) (struct s_xl_daio_data *, unsigned
__int64 *);

und nun laufen in der C-DLL zwei Threads, die beim eintreffen von
neuen Nachrichten (CAN) bzw. zyklisch (Digital/Analog) die jeweilige
Funktion von VB aufrufen:

DWORD WINAPI CANEmpfangsThread(LPVOID par)
{
   XLstatus xlstatus;
   unsigned int counter = RECEIVE_EVENT_SIZE;
   XLevent xlEvent;
   g_CANLeseThreadBeendet = CreateEvent(NULL, FALSE, FALSE, NULL);
   ResetEvent(g_CANLeseThreadBeendet);
   
   while (g_CANLeseThreadRun)
   {
      _RPT0(0,"In der THREAD-SCHLEIFE\n");
      // warten bis eine CAN-Botschaft eingeht, max. 1000 ms
      WaitForSingleObject(g_hCANEvent,1000 );
      if (g_CANLeseThreadRun == 0)
         _RPT0(0, "Nach Wait.., Flag ist nun 0\n");
      counter = RECEIVE_EVENT_SIZE;
      xlstatus = xlReceive(g_portHandleCAN, &counter, &xlEvent);
      
      if (g_CANLeseThreadRun == 0)
         _RPT0(0, "Nach erstem Receive, Flag ist nun 0\n");
      // Hier noch die Callback-Funktion von VB mit der Message
aufrufen, wenn MSG nicht leer
      if (xlstatus == XL_SUCCESS)
      {
         _RPT0(0,"1. MESSAGE EMPFANGEN\n");
         if (xlEvent.tag == XL_RECEIVE_MSG &&
xlEvent.tagData.msg.flags != XL_CAN_MSG_FLAG_TX_COMPLETED)
         {
            if (g_CANLeseThreadRun == 0)
               _RPT0(0, "Vor Aufruf, Flag ist nun 0\n");
            g_Adress_of_Callback_CAN_Messages (&xlEvent.tagData.msg,
&xlEvent.timeStamp);
            if (g_CANLeseThreadRun == 0)
               _RPT0(0, "Nach Aufruf, Flag ist nun 0\n"); }
      }
      
      while (!xlstatus && g_CANLeseThreadRun)
      {
         XLevent xlevent;
         _RPT0(0,"In der While-Schleife\n");
         // Wenn noch Messages in der Queue sind, dann diese abholen
         
         // Hier sollen alle Messages aus der Queue abgeholt werden,
damit
         // der Event wieder gelöscht wird
         counter = RECEIVE_EVENT_SIZE;
         xlstatus = xlReceive(g_portHandleCAN , &counter, &xlevent);
         if (xlevent.timeStamp != xlEvent.timeStamp)
         {
            // Hier noch die Callback-Funktion von VB mit der Message
aufrufen, wenn MSG nicht gleich der Vorhergehenden
            if (xlEvent.tag == XL_RECEIVE_MSG &&
xlevent.tagData.msg.flags != XL_CAN_MSG_FLAG_TX_COMPLETED)
            {
               if (g_CANLeseThreadRun == 0)
                  _RPT0(0, "Vor Aufruf, Flag ist nun 0\n");
               g_Adress_of_Callback_CAN_Messages
(&xlEvent.tagData.msg, &xlEvent.timeStamp);
               if (g_CANLeseThreadRun == 0)
                  _RPT0(0, "Nach Aufruf, Flag ist nun 0\n");
            }
         }
      }
   }
   _RPT0(0,"CAN-Empfangs-Thread-Schleife verlassen\n");
   SetEvent (g_CANLeseThreadBeendet);
   return NO_ERROR;
}

DWORD WINAPI DAIOLesenThread(LPVOID par)
{
   XLstatus xlstatus;
   unsigned int msgsrx = RECEIVE_EVENT_SIZE;
   XLevent actualxlevent;
   // Event einrichten, der ein Ende des Threads signalisiert
   g_DAIOLeseThreadBeendet = CreateEvent(NULL, FALSE, FALSE, NULL);
   g_DAIOLeseThreadRun = 1;
   
   while (g_DAIOLeseThreadRun)
   {
      WaitForSingleObject(g_hDAIOEvent,INFINITE);
      xlstatus = xlReceive ( g_portHandleDAIO, &msgsrx,
&actualxlevent);
      g_Adress_of_Callback_DAIO_Measurements(&actualxlevent.tagData.daioData,
&actualxlevent.timeStamp);
   }
   // Signal für das Ende des Threads setzen
   _RPT0(0,"DAIO-Empfangs-Thread-Schleife verlassen\n");
   SetEvent (g_DAIOLeseThreadBeendet);
   return NO_ERROR;
}

In VB habe ich nun zwei simple Funktionen, die via Callback aufgerufen
werden:

Public Sub CallbackCAN(ByRef msg As CanMessage, ByRef timestamp As
Currency)

If (frmMain.lstCAN.ListCount < 2000) Then
   frmMain.lstCAN.AddItem (CStr(msg.id) & vbTab & "Flag:" &
CStr(msg.flags) & vbTab & CStr(timestamp))
Else
   frmMain.lstCAN.RemoveItem (1)
   frmMain.lstCAN.AddItem (CStr(msg.id) & vbTab & "Flag:" &
CStr(msg.flags) & vbTab & CStr(timestamp))
End If
End Sub

Public Sub CallbackDAIO(ByRef msg As DAIOMessage, ByRef timestamp As
Currency)
   If (frmMain.lstDAIO.ListCount < 20) Then
      frmMain.lstDAIO.AddItem (CStr(msg.analog(2)))
   Else
       frmMain.lstDAIO.RemoveItem (1)
      frmMain.lstDAIO.AddItem (CStr(msg.analog(2)))
   End If
End Sub

Aber selbst wenn ich die DAIO (Digital-Analog-Input-Output)-Funktion
wie folgt ändere:

Public Sub CallbackDAIO(ByRef msg As DAIOMessage, ByRef timestamp As
Currency)

End Sub



Relevant Pages

  • Re: UDT-Array vom RAM lesen
    ... >> erstellt diese und der PipeClient öffnet diese Pipe per Open unter ... Private Type MyUDT ... End Type ... Public Sub Save() ...
    (microsoft.public.de.vb)
  • Re: Auflistungen - Kaum glaubbare Zeiten
    ... Public Class Form1 ... Public Sub New() ... End Sub ... Dim clsLine As New LineClass ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Bitmaps auf einen Formzeichnen
    ... Public Icons as New Collection ... End Function ... Private Sub Form_Load ... ByVal ySrc&, ByVal dwRop&) ...
    (microsoft.public.de.vb)
  • Re: Schnittstelle oder Attribut?
    ... der "das Objekt dieser Klasse hat ein bestimmtes Attribut" aussagt. ... Public Sub SetzePosition ... End Sub ... Das Interface "IBenennbar" ist ebenfalls implementiert, das dazu nötige Property kann aber MustOverride sein und braucht nicht ausprogrammiert werden. ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: GDI+ Performance sehr schlecht (?)
    ... Private Sub InitializeComponent() ... End Sub ... If components IsNot Nothing Then ... Private _buffGraphics As BufferedGraphics ...
    (microsoft.public.de.german.entwickler.dotnet.vb)