CSocket und Threads oder CAsyncSocket



  • Welche Vor- und Nachteile gibt es dabei?



  • CSocket && Thread != CAsyncSocket!

    Stichpunkt, abbrechen von Übertragungen! Das funktioniert nur bei CAsyncSocket. Der Thread bricht erst ab, wenn CSocket komplett übertragen hat.



  • Ist also CAsyncSocket immer besser als CSocket && Thread ?



  • und wie löse ich in einem CAsyncSocket das Problem mit dem Zugriff auf einen CDialog?



  • Ist also CAsyncSocket immer besser als CSocket && Thread ?

    Da könntest Du auch fragen:
    "Ist ein Mass Bier immer besser als 5x0.2l-Gläser?

    A: Es gibt für beides Einsatzmöglichkeiten!

    und wie löse ich in einem CAsyncSocket das Problem mit dem Zugriff auf einen CDialog?

    Ich wusste nicht, dass das jemals ein Problem war.



  • doch, oder ich mach was falsch: meine Klasse ist von CAsyncSocket abgeleitet. In ihrem ctor wird ein CDialog* erstellt. In OnReceive rufe ich dann Memberfunktionen von dem Dialogobjekt auf, die Membervarialblenwerte des Dialogobjekts auslesen. Vor dem Auslesen mache ich aber noch ein ASSERT_VALID(m_pDlg);. Dabei kommt ne Assertion Failed.



  • ??? CODE ???



  • class CSMTPConnection : public CAsyncSocket
    {
    public:
        virtual BOOL OnSendProgress(DWORD dwCurrentBytes, DWORD dwTotalBytes) =0;
    
    protected:
        void OnReceive(int nErrorCode);
    };
    
    class CMailSender : public CSMTPConnection
    {
    public:
        CMailSender(CMyDoc* pDoc);
    
        virtual BOOL OnSendProgress(DWORD dwCurrentBytes, DWORD dwTotalBytes);
    protected:
        CMyDoc* m_pDoc;
        CProgressDialog* m_pDlg;
    };
    
    void CSMTPConnection::OnReceive(int nErrorCode)
    {
    //....
    OnSendProgress(...);
    //...
    }
    
    CMailSender::CMailSender(CMyDoc* pDoc) : 
        m_pDoc(pDoc)
    {
        ASSERT_VALID(m_pDoc);
    
        CProgressDialog* m_pDlg = new CProgressDialog;
        m_pDlg->Create(IDD_PROGRESSDIALOG);
        m_pDlg->ShowWindow(SW_SHOW);
    }
    
    BOOL CMailSender::OnSendProgress(DWORD dwCurrentBytes, DWORD dwTotalBytes)
    {
        // ein Zugriff auf m_pDoc gibt keinen Fehler!
        ASSERT_VALID(m_pDlg); // PENG!
        m_pDlg->m_ctlCurrentMailProgress.SetPos((100*dwCurrentBytes)/dwTotalBytes);
    
        return !m_pDlg->AbortFlag(); // fortfahren?
    }
    


  • 😞



  • CMailSender::CMailSender(CMyDoc* pDoc) : 
        m_pDoc(pDoc)
    {
        ASSERT_VALID(m_pDoc);
    
        CProgressDialog* m_pDlg = new CProgressDialog;
        m_pDlg->Create(IDD_PROGRESSDIALOG);
        m_pDlg->ShowWindow(SW_SHOW);
    }
    

    NNNNEEEEEEIIIIIIINNNNNN 😉

    So geht's:

    CMailSender::CMailSender(CMyDoc* pDoc) : 
        m_pDoc(pDoc)
    {
        ASSERT_VALID(m_pDoc);
        m_pDlg = new CProgressDialog;
        m_pDlg->Create(IDD_PROGRESSDIALOG);
        m_pDlg->ShowWindow(SW_SHOW);
    }
    


  • DANKE! Mann, bin ich doof! DANKEE!!!!!!!! 🙂 🙂


Anmelden zum Antworten