2016-11-15 39 views
0

我有一個C++程序Code :: Block與gcc和wxWidgets。 當我的工作線程拋出一個wxThreadEvent與一個結構作爲有效載荷我的程序崩潰(實際上不是在扔,但此刻我想獲得有效載荷在主)。程序崩潰後wxThreadEvent :: GetPayload()

有沒有人有一個想法是什麼錯?

工作線程部分:

wxThread::ExitCode NavigationThread::Entry() 
{ 
    wxThreadEvent event(wxEVT_THREAD, ID_REFRESH_DIRECTION); 
    position_variables positionPayload; 
    positionPayload.latitude = latDouble; 
    positionPayload.longitude = lonDouble; 
    positionPayload.direction = direction; 
    event.SetPayload(&positionPayload); 
    m_parent->GetEventHandler()->AddPendingEvent(event); 
} 

的結構:

struct position_variables{ 

    double latitude; 
    double longitude; 
    wxString direction; 
}; 

class NavigationThread : public wxThread 
{ 
    ... 
} 

的main.cpp中

WindowsDgpsGUIFrame::WindowsDgpsGUIFrame(wxWindow* parent,wxWindowID id) 
{ 
    Bind(wxEVT_THREAD, &WindowsDgpsGUIFrame::onRefreshDirections, this, ID_REFRESH_DIRECTION); 
} 

void WindowsDgpsGUIFrame::onRefreshDirections(wxThreadEvent& event) 
{ 
    position_variables answerDirections = event.GetPayload<position_variables>(); //Here it crashes 
} 

時死機正常 「運行」 模式時,一個窗口打開程序停止工作。在調試模式中存在的代碼::塊說着有關SIGSEGV, segmentation fault(或類似的東西)的小窗口,這是調用堆棧:

#0 00877A54 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)() (??:??) 
#1 04A1E550 ??() (??:??) 
#2 007ED139 position_variables::position_variables(this=0x4a1e588) (D:/WindowsDgps/WindowsDgpsGUI/NavigationThread.h:54) 
#3 00851B54 wxAny::As<position_variables>(this=0x4c6fe70) (C:/wxWidgets-3.0.2/include/wx/any.h:979) 
#4 0084E70C wxEventAnyPayloadMixin::GetPayload<position_variables>(this=0x4c6fe58) (C:/wxWidgets-3.0.2/include/wx/event.h:1219) 
#5 0043320E WindowsDgpsGUIFrame::onRefreshDirections(this=0x4be2a68, event=...) (D:\WindowsDgps\WindowsDgpsGUI\WindowsDgpsGUIMain.cpp:440) 
#6 0063AA48 wxAppConsoleBase::HandleEvent (this=0x4b2bde0, handler=0x4be2a68, func=(void (wxEvtHandler::*)(wxEvtHandler * const, wxEvent &) (../../src/common/appbase.cpp:611) 
#7 0063AAD9 wxAppConsoleBase::CallEventHandler(this=0x4b2bde0, handler=0x4be2a68, functor=..., event=...) (../../src/common/appbase.cpp:623) 
#8 0062DEA1 wxEvtHandler::ProcessEventIfMatchesId(entry=..., handler=0x4be2a68, event=...) (../../src/common/event.cpp:1392) 
#9 0062EB3A wxEvtHandler::SearchDynamicEventTable(this=0x4be2a68, event=...) (../../src/common/event.cpp:1751) 
#10 0062E318 wxEvtHandler::TryHereOnly(this=0x4be2a68, event=...) (../../src/common/event.cpp:1585) 
#11 007C50A0 wxEvtHandler::TryBeforeAndHere(this=0x4be2a68, event=...) (../../include/wx/event.h:3671) 
#12 0062E157 wxEvtHandler::ProcessEventLocally(this=0x4be2a68, event=...) (../../src/common/event.cpp:1522) 
#13 0062E0FF wxEvtHandler::ProcessEvent(this=0x4be2a68, event=...) (../../src/common/event.cpp:1495) 
#14 0062DCEC wxEvtHandler::ProcessPendingEvents(this=0x4be2a68) (../../src/common/event.cpp:1359) 
#15 0063A69C wxAppConsoleBase::ProcessPendingEvents(this=0x4b2bde0) (../../src/common/appbase.cpp:520) 
#16 007F0883 wxIdleWakeUpModule::MsgHookProc(nCode=0, wParam=1, lParam=77720172) (../../src/msw/window.cpp:7454) 
#17 746BE1A1 USER32!TrackMouseEvent() (C:\WINDOWS\SysWOW64\user32.dll:??) 
#18 ?? ??() (??:??) 

與#2紅色突出顯示。

也許它與Clone()部分SetPayload()有關?雖然我不太明白我應該如何使用它或爲什麼我的有效載荷訪問會有問題......

+0

@AHue,你使用靜態事件表還是bind()/ connect()?你能在崩潰時顯示這段代碼和回溯嗎? – Igor

+0

@Igor我用請求的部分編輯了問題。我發現了一個解決方法,現在我使用了兩個事件,每個事件都有一個帶有必要信息的'SetString',但我對它並不滿意... – Lehue

回答

1

您不能使用指向局部變量的指針,該變量在您退出後立即銷燬包含它的函數,從而使指針無效,作爲有效載荷。改爲使用對象本身,而不是指向它的指針。

+0

愚蠢的問題,但我該怎麼做?...我不看不到我在錯誤的地方使用指針的位置... – Lehue

+0

您可以使用&& positionPayload',即將一個指針指向該對象,然後將其作爲有效負載進行存儲。它是通過'wxThreadEvent'而不是對象本身複製的_pointer_。 –