Zdravím,
potřeboval bych poradit ohledně jednoho problému s pointry. Mám DLL knihovnu v C++, kde pomocí pointrů komunikuji a předávám data do aplikace. Jakmile aplikace zasílá data do knihovny, je všecko OK, dokonce i když vyčítá data, tak všecko běží tak jak má, ale jakmile se vlákno pokusí něco zapsat, tak celá aplikace spadne. Snažil jsem se něco najít na googlu, přímo na stránkách C++ i v literatuře, ale nic z toho co jsem našel nevyřešilo můj problém.
U této funkce všechno funguje tak jak má:
__declspec(dllexport) void __cdecl GetInput( HANDLE hDriver,
unsigned ChannelNumber,
TValue *InputValue )
{
//vrací stav kanálu
TextWriter^ streamWriter = gcnew StreamWriter( "furness_log.txt", true );
streamWriter->WriteLine( "Volání funkce: GetInput()" );
streamWriter->Flush();
streamWriter->Close();
TPDriver PDriver;
PDriver = (TPDriver) hDriver;
TPChannel PChannel;
PChannel = &(PDriver->Channels[ChannelNumber]);
EnterCriticalSection( &PDriver->DataCS );
switch(ChannelNumber) {
case 1:
InputValue->ValShortCard = PChannel->ChanelValue.ValShortCard;
break;
case 2:
InputValue->ValCardinal = PChannel->ChanelValue.ValCardinal;
break;
case 3:
InputValue->ValPString = PChannel->ChanelValue.ValPString;
break;
}
LeaveCriticalSection( &PDriver->DataCS );
};
Jenže u téhle funkce (vyzkoušel jsem snad všechny možnosti úprav) mi to padá
unsigned long __stdcall ThreadProc( TPDriver PDriver )
{
MSG msg;
System::IO::Ports::SerialPort _seriak;
_seriak.PortName = "COM" + PDriver->ComPort.ToString();
_seriak.ReadTimeout = 1000;
TPChannel PChannel1= &(PDriver->Channels[1]);
TPChannel PChannel2 = &(PDriver->Channels[2]);
TPChannel PChannel3 = &(PDriver->Channels[3]);
PeekMessage( &msg, 0, 0, 0, PM_REMOVE ); // create thread queue
SetEvent( PDriver->HThreadRunning );
try
{
_seriak.Open();
}
catch (Exception^ ex)
{
PChannel1->ChanelValue.ValShortCard = statusNoConnect;
PChannel2->ChanelValue.ValCardinal = 0;
strcpy("Během připojování došlo k neznámé chybě", (char *)PChannel3->ChanelValue.ValPString);
PDriver->DriverCallBack( PDriver->DriverCallBackHandle, dcfDriverException, 0 );
}
}
Ještě doplním jednotlivé definice:
struct TValue { // Value storage
struct {
unsigned Type;
union { // switch (Type)
char ValBoolean; // vtBoolean
unsigned char ValShortCard; // vtShortCard
unsigned short ValCardinal; // vtCardinal
unsigned ValLongCard; // vtLongCard
signed char ValShortInt; // vtShortInt
signed short ValInteger; // vtInteger
signed ValLongInt; // vtLongInt
float ValReal; // vtReal
double ValLongReal; // vtLongReal
tString255 *ValPString; // vtPString
struct { // vtDriverString
unsigned StringCharLength;
void *PString;
};
struct { // vtBuffer
unsigned char BType;
unsigned short BLen256;
void *PBuffer;
};
};
};
};
// chanel data structures
struct TChannel {
unsigned long Status;
double LastTime;
double ActualTime;
double Delay;
TValue ChanelValue;
double RangeFrom;
double RangeTo;
};
typedef TChannel *TPChannel;
// driver data structures
struct TDriver {
// common data
unsigned DataLength;
unsigned (__cdecl *DriverCallBack)(HANDLE, unsigned, void *);
HANDLE DriverCallBackHandle;
char ParamFileName[260];
int ComPort;
int BaudRate;
int Parity;
int DataBits;
int StopBits;
// private data
TChannel Channels[maxDriverChannels];
HANDLE HThread;
unsigned long IdThread;
HANDLE HThreadRunning;
CRITICAL_SECTION DataCS;
};
typedef TDriver *TPDriver;
Pokud je sériový port volný, tak ho otevře a bez problému s ním pracuje, jenže jakmile sériový port otevřu v jiné aplikaci, a pak se jej snažím otevřít v této knihovně, tak se to právě pokusí zapsat důvod neotevření portu a zápis do paměti přes pointry.
Jen pro upřesnění, důvodem, proč využívám v C++ .NET Framework je ten, že daleko déle pracuji s C# a jsem tudíž na .NET zvyklý. Pokud ale znáte lepší způsob, jak třeba používat sériový port, rád se poučím.
Předem děkuji za všechny náměty.