2016-09-20 19 views
1

スレッドからオンラインファイルを読み込もうとしましたが、問題があります。スレッド内にない場合、同じコードが正しく動作します。しかし、それがスレッドの内部にあれば、アプリケーションは終了します。wxWidgetsを使用してスレッドからオンラインファイルを読み取る方法

スレッドは、ファイルを読み取ろうとしなければ正しく動作します。

次のコードは正しく動作:

wxInputStream *httpStream; ///it is a global variable. 

void contadorFrame::ConnetAndRead()  
{  
    wxHTTP get; 
    get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8")); 
    get.SetTimeout(10); 

    wxString sever, path; 
    getURLParts(TextCtrl_url->GetValue(), sever, path); 


    while (!get.Connect(sever ,80)) 
    wxSleep(5); 

    httpStream = get.GetInputStream(path); 

    if (get.GetError() == wxPROTO_NOERR) 
    { 
     wxString xml_buff; 
     wxStringOutputStream out_stream(&xml_buff); 

     httpStream->Read(out_stream); 
     std::string standarize(estandarizaXML(xml_buff.ToStdString())); 
     readXML(standarize.c_str());///read file from buffer 
    } 
    else 
    { 
     wxMessageBox(_T("Unable to connect!")); 
    } 

    wxDELETE(httpStream); 
    get.Close(); 
} 

私は、スレッド内のGUI機能を使用しないでください知っている、と私はこの方法をしようとしています。

void contadorFrame::ConnetAndRead() 
{ 
    wxHTTP get; 
    get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8")); 
    get.SetTimeout(10); 

    wxString sever, path; 
    getURLParts(TextCtrl_url->GetValue(), sever, path); 


    while (!get.Connect(sever ,80)) 
    wxSleep(5); 

    httpStream = get.GetInputStream(path); 

    if (get.GetError() == wxPROTO_NOERR) 
    { 
     PerformCalculation(); // create and run the thread 
    } 
    else 
    { 
     wxMessageBox(_T("Unable to connect!")); 
    } 

    wxDELETE(httpStream); 
    get.Close(); 
} 

void contadorFrame::PerformCalculation()// create and run the thread  
{  
    m_pThread = new MyThread(this, httpStream); 
    m_pThread->Create(); 

    if (m_pThread->Run() != wxTHREAD_NO_ERROR) 
    { 
     wxLogError("Can't create the thread!"); 
     delete m_pThread; 
     m_pThread = NULL; 
    } 
} 

次のコードは、

void *MyThread::Entry()  
{  
    wxCommandEvent evt(wxEVT_MYTHREAD, GetId()); 

    wxString xml_buff; 
    wxStringOutputStream out_stream(&xml_buff); 
    httpStream->Read(out_stream);    //this fails 

    std::string standarize(estandarizaXML(xml_buff.ToStdString())); 
    readXML(standarize.c_str());///read file from buffer 

    wxPostEvent(m_pHandler, evt); 
    return (wxThread::ExitCode)0; // success 
} 

誰もがこの問題を解決するために助けることができ、誤って動作しますか?同じことをする別の方法は? ありがとうございます!

答えて

0

私には解決策があります。しかし、それは完全にうまく動作しません!

http://docs.wxwidgets.org/trunk/classwx_socket_base.html

あなたが他のものを作成する前に初期化()を呼び出すことにより、メインスレッドからソケットを初期化する必要があります(例えば、別のスレッドでwxFTPまたはwxHTTPを使用して)でも、暗黙的に、複数のスレッドからwxSocketを使用。

void contadorFrame::ConnetAndRead() 
{ 
    wxHTTP get; 
    get.Initialize(); 


    get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8")); 
    get.SetTimeout(10); 

    wxString sever, path; 
    getURLParts(TextCtrl_url->GetValue(), sever, path); 


    while (!get.Connect(sever ,80)) 
    wxSleep(5); 

    httpStream = get.GetInputStream(path); 

    if (get.GetError() == wxPROTO_NOERR) 
    { 
     PerformCalculation(); // create and run the thread 
    } 
    else 
    { 
     wxMessageBox(_T("Unable to connect!")); 
    } 

    wxDELETE(httpStream); 
    get.Close(); 
} 

これが失敗したが、私がしなければ(wxHTTPが取得)グローバル変数は、このように、それは今

wxHTTP get; 
void contadorFrame::ConnetAndRead() 
{ 

    get.Initialize(); 


    get.SetHeader(_T("Content-type"), _T("text/xml; charset=utf-8")); 
    get.SetTimeout(10); 

    wxString sever, path; 
    getURLParts(TextCtrl_url->GetValue(), sever, path); 


    while (!get.Connect(sever ,80)) 
    wxSleep(5); 

    httpStream = get.GetInputStream(path); 

    if (get.GetError() == wxPROTO_NOERR) 
    { 
     PerformCalculation(); // create and run the thread 
    } 
    else 
    { 
     wxMessageBox(_T("Unable to connect!")); 
    } 

    wxDELETE(httpStream); 
    get.Close(); 
} 

問題を作品デバッガが私に警告メッセージを伝えることですこのような。

../../scr/common/socket.cpp(297):アサート「」アプリ「を」初期化()に失敗しました:ソケットはwxApp なしで初期化することはできませんあなたがプログラムを中止しますか?

いいえを選択した場合、プログラムは完璧に実行されます。

ソケットを初期化する正しい方法は何ですか?つまり、どこにこの(wxHTTP :: Initialize())を置くとデバッガからの警告メッセージを受け取らないのですか?

0

は、私はこの

bool contadorApp::OnInit() 
{ 
    wxSocketBase::Initialize(); 

    //(*AppInitialize 
    bool wxsOK = true; 
    wxInitAllImageHandlers(); 
    if (wxsOK) 
    { 
     contadorFrame* Frame = new contadorFrame(0); 
     Frame->Show(); 
     SetTopWindow(Frame); 
    } 
    //*) 
    return wxsOK; 
} 

この

class contadorFrame: public wxFrame 
{ 
    public: 
     wxHTTP get; 
}; 

をしました:-)

SOLVEは今完璧な作品!!

thx u guys !!