Pointery a padání aplikace – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pointery a padání aplikace – C / C++ – Fórum – Programujte.comPointery a padání aplikace – C / C++ – Fórum – Programujte.com

 

DragonBehemont0
Super člen
20. 6. 2011   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 89.24.196.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
nervak0
Věrný člen
Nahlásit jako SPAM
IP: 213.211.51.–
DragonBehemont0
Super člen
20. 6. 2011   #3
-
0
-

To nervak : nevím, zda jsi tím myslel to, že jsem tam omylem přehozil argumenty, ale i když jsem to přehodil tak, jak by to mělo být, tak to stejně padá. A nebo si tím myslel něco konkrítního?

Nahlásit jako SPAM
IP: 89.24.196.–
Nemusíte vědět vše, stačí jen, když víte, kde to najít, a jak to použít. Naučíte se to právě tím používáním ;-)
liborb
~ Redaktor
+18
Guru
20. 6. 2011   #4
-
0
-

ValPString je jenom pointer. Musíš koukat na to, jestli přijde z CW inicializovaný nebo ne a případně pak alokovat (název tString255 naznačuje na jakou velikost) new tString255[255];

Pokud používáš ValPString "z vlastní vůle", tak musíš alokovat vždy.

EDIT: samozřejmě alokaci upravit dle C++/CLI :)

Nahlásit jako SPAM
IP: 78.80.52.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý