電子書籍の厳選無料作品が豊富!

お世話になります

無線機とGPSセンサーをCOMPORTでつないで操作やモニターするソフトを作成してまして
煮詰まってしまったので質問させていただきます。

無線機からデータの読み込みで取りこぼしや動作が遅くなってしまったので
マルチスレッドで動作させています

タイミングはまちまちですが動作させてる時に下記のような例外が出てしまいます

inline BOOL AFXAPI AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
{
// we remove WM_QUIT because if it is in the queue then the message box
// won't display
MSG msg;
BOOL bQuit = PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
BOOL bResult = _CrtDbgReport(_CRT_ASSERT, lpszFileName, nLine, NULL, NULL);
if (bQuit)
PostQuitMessage((int)msg.wParam);
return bResult;
}
ATLASSERT( (nCount == 0) || ((iFirst+nCount) <= this->GetLength()) );

// optimize case of returning entire string
if( (iFirst == 0) && ((iFirst+nCount) == this->GetLength()) )
{
return( *this );
}

return( CStringT( this->GetString()+iFirst, nCount, GetManager() ) );
}

void Release() throw()
{
ATLASSERT( nRefs != 0 );

if( _InterlockedDecrement( &nRefs ) <= 0 )
{
pStringMgr->Free( this );
}
}

IAtlStringMgr* GetManager() const throw()
{
IAtlStringMgr* pStringMgr = GetData()->pStringMgr;
return pStringMgr ? pStringMgr->Clone() : NULL;
}

static CStringData* __cdecl CloneData(_Inout_ CStringData* pData)
{
CStringData* pNewData = NULL;

IAtlStringMgr* pNewStringMgr = pData->pStringMgr->Clone(); ここででた
if( !pData->IsLocked() && (pNewStringMgr == pData->pStringMgr) )
{
pNewData = pData;
pNewData->AddRef();
}
else
{
pNewData = pNewStringMgr->Allocate( pData->nDataLength, sizeof( XCHAR ) );
if( pNewData == NULL )
{
ThrowMemoryException();
}
pNewData->nDataLength = pData->nDataLength;
CopyChars( PXSTR( pNewData->data() ), pData->nDataLength+1,
PCXSTR( pData->data() ), pData->nDataLength+1 ); // Copy '\0'
}

return( pNewData );
}


例外がスローされました:読み取りアクセス違反。
**pStringMgr** が 0xDDDDDDDD でした。
ハンドルされない例外が 0x7C6AFC66 (ucrtbased.dll) で発生しました(FT991REMOTE.exe 内):
無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。

とかいろいろでます。
どうやら文字列のやり取りで出てるようなのですが解決に向けてどのように調べていけばよいでしょうか?

色々いじって頻繁出てくるところから少し出にくくなるまでは行ったのですがなかなかうまくいきません
概要です
CFT991REMOTEDlg.cpp
から各処理を呼び出し

FT991_command.cpp
UINT __cdecl FT991_command::CALL_FT991_READ_Thread(LPVOID pData)//スレッド作成

FT991_AUTO_READ(&SSD ,&RRD); //COMPORTから呼び込み
それそれの関数でデータを成形
FT991_commandのグローバル変数に書き込み


FT991_commandのグローバル変数から読んで
CFT991REMOTEDlg
で表示や設定

よろしくお願いします

A 回答 (1件)

MFCはイマイチ解っていませんが…。


そもそもVisual Studioのバージョンはなんなのでしょう?

んで、VSのDebugモードでのビルドではみ初期化のローカル変数(たぶんクラスのメンバ変数も)は0xDDで初期化されます。
# もちろん、ソレを期待するコードは失格です。
ということで、
>**pStringMgr** が 0xDDDDDDDD でした。
ということは、どこかで初期化すべきところご足りないのでしょう。

そもそも…CloneData()の呼び出しはどこなのか?とか、
CStringDataってどんなクラスなんぞや?とか、
情報不足です。

マルチスレッドで動かす。としているプログラムで、
>FT991_commandのグローバル変数に書き込み
が安全に処理できるのか?というのもありますし。
    • good
    • 0
この回答へのお礼

失礼しました
回答ありがとうございます
開発環境を忘れてましたVS2019です

初期化で忘れているところはないと思っているのですが
どのタイミングでなるかがわからないでいます
印象としては読み込みが忙しくなるところで出る感じです

ソースを載せるにしてもいっぱいあるのでどこから辺りを載せるべき
ものなのかわかないでいます

載せているソースは多分MFCで自分では書いてないところです
例外が発生した時に飛ぶところとしてのせました。

関数が消える時にその関数内の変数にアクセスしてると考え
極力グローバル関数で使うとかやってみてもあまり効果があるような
ないような感じでした

お礼日時:2021/10/22 20:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!