SGyves
asked on
Multithread barrier
I keep running into this problem in my efforts to multithread successfully. As many of you know, there is a problem passing CObject derived objects from one thread to another. Right now here is my problem. I have a DCCConnection (a file download object). This object handles all of the connecting to a server and recieving of a file in a worker thread, the thread updates members of the DCCConnection object that contain information about download speed, progress, and percent complete. Now..in this DCCConnection object I have a CProgressDlg object (as a member) that I want to be displayed during downloads. I want to place a timer in this object that updates the dialog by checking the DCCConnection object members for the latest info and then updating the dialog display. Here is the problem. This all seemed to be good in theory...but what I need my dialog to have is a pointer to the DCCConnection object. I can't seem to include the DCCConncetion.h file in my progress header. It fails terribly at compile time. Now it might be helpful to know that DCCConnection.h already includes Progress.h and that I want Progress.h to include DCCConnection.h. The only way I can let the ProgressDlg object access the DCCConnection members is to give it a pointer to the DCCConnection object. What on earth is the problem here??
What errors do you get? Do you have "multiple inclusion guards", e.g.
//DCCConnection.h:
#ifndef __DCCConnection_h
#define __DCCConnection_h
// rest of the header file goes here...
#endif
//DCCConnection.h:
#ifndef __DCCConnection_h
#define __DCCConnection_h
// rest of the header file goes here...
#endif
ASKER
It is telling me everything from missing a ; (which of course I am not because if I remove the inclusion...I do not get the error. It also tell me that CProgressDlg is missing its storage-class or type identifiers.
I tried doing the protection described above...here I will paste the .h files.
#pragma once
#include "afxcmn.h"
#include "DCCConnection.h"
#ifndef ProgressDlg_h
#define ProgressDlg_h
// CProgressDlg dialog
class CProgressDlg : public CDialog
{
DECLARE_DYNAMIC(CProgressD lg)
public:
CProgressDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CProgressDlg();
// Dialog Data
enum { IDD = IDD_DIALOG_XFER_PROG };
protected:
virtual void DoDataExchange(CDataExchan ge* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
public:
CProgressCtrl m_prgctlPercentComp;
void SetFileSize(long int fs);
private:
long int m_lFileSize;
CString m_sFileName;
CString m_sPercComp;
CDCCConnection* m_pdcc;
};
#endif
#pragma once
#include "resource.h"
#include "ProgressDlg.h"
#ifndef DCCConnection_h
#define DCCConnection_h
class CDCCConnection
{
public:
CDCCConnection(CString ip, CString p, CString fs, CString fn);
virtual ~CDCCConnection(void);
private:
u_long m_lIP;
u_short m_nPort;
CString m_sFileName;
long m_lFileSize;
CProgressDlg* pDlg;
public:
CString GetDCCPort(void);
CString GetDCCIP(void);
CString GetDCCFileSize(void);
CString GetDCCFileName(void);
static UINT FileTransProc(LPVOID pParam);
UINT RecieveFileToDisk(void);
void DoRecieveFile(void);
};
#endif
Maybe that will help....
I tried doing the protection described above...here I will paste the .h files.
#pragma once
#include "afxcmn.h"
#include "DCCConnection.h"
#ifndef ProgressDlg_h
#define ProgressDlg_h
// CProgressDlg dialog
class CProgressDlg : public CDialog
{
DECLARE_DYNAMIC(CProgressD
public:
CProgressDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CProgressDlg();
// Dialog Data
enum { IDD = IDD_DIALOG_XFER_PROG };
protected:
virtual void DoDataExchange(CDataExchan
DECLARE_MESSAGE_MAP()
public:
CProgressCtrl m_prgctlPercentComp;
void SetFileSize(long int fs);
private:
long int m_lFileSize;
CString m_sFileName;
CString m_sPercComp;
CDCCConnection* m_pdcc;
};
#endif
#pragma once
#include "resource.h"
#include "ProgressDlg.h"
#ifndef DCCConnection_h
#define DCCConnection_h
class CDCCConnection
{
public:
CDCCConnection(CString ip, CString p, CString fs, CString fn);
virtual ~CDCCConnection(void);
private:
u_long m_lIP;
u_short m_nPort;
CString m_sFileName;
long m_lFileSize;
CProgressDlg* pDlg;
public:
CString GetDCCPort(void);
CString GetDCCIP(void);
CString GetDCCFileSize(void);
CString GetDCCFileName(void);
static UINT FileTransProc(LPVOID pParam);
UINT RecieveFileToDisk(void);
void DoRecieveFile(void);
};
#endif
Maybe that will help....
And where in the above should the ';' be missing?
ASKER
There is no ';' missing....it is just that in CProgressDlg.h....it claims to not know what a:
CDCCConnection* m_pdcc;
is. It claims that CDCCConnection an error:
c:\Documents and Settings\mod_test\My Documents\Visual Studio Projects\GoIRC\DCCConnecti on.h(20): error C2501: 'CDCCConnection::CProgress Dlg' : missing storage-class or type specifiers
Even though I am telling it what it is by putting the DCCConnection.h in the file.
CDCCConnection* m_pdcc;
is. It claims that CDCCConnection an error:
c:\Documents and Settings\mod_test\My Documents\Visual Studio Projects\GoIRC\DCCConnecti
Even though I am telling it what it is by putting the DCCConnection.h in the file.
ASKER
It claims to be missing a ';' before CDCCConnection* m_pdcc;
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Yes...I thought there was some problem with circular definitions...I just didn't know how to get rid of it. Thank you :)
ASKER
Now it is saying use of undefined type in my .cpp when I try to reference my CDCCConnection object.
What is up with that??
What is up with that??
ASKER
Just included the .h for DCCConnection in there...it is okay now
ASKER