Bonjour,
C'est la première fois que je dois utiliser des threads dans mon programme et apparemment, j'ai un problème de linker que je n'arrive pas à résoudre, en cherchant sur google j'ai trouvé quelques solutions possibles mais cela n'a pas marché.
Voici les parties de mon code correspondant au probleme :

QuadrotorControlDlg.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma once
#include "afxwin.h"
 
 
// CQuadrotorControlDlg dialog
class CQuadrotorControlDlg : public CDialogEx
{
// Construction
public:
	CQuadrotorControlDlg(CWnd* pParent = NULL);	// standard constructor
 
// Dialog Data
	enum { IDD = IDD_QUADROTORCONTROL_DIALOG };
 
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
 
 
// Implementation
protected:
	HICON m_hIcon;
 
	// Generated message map functions
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedStop();
	CEdit m_editInfoBox;
	double m_dblDesiredAltitude;
	afx_msg void OnBnClickedReach();
	static CEdit m_editAltitude;
};
QuadrotorControlDlg.cpp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// QuadrotorControlDlg.cpp : implementation file
//
 
#include "stdafx.h"
#include "QuadrotorControl.h"
#include "QuadrotorControlDlg.h"
#include "afxdialogex.h"
#include "Variables.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// CAboutDlg dialog used for App About
 
class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();
 
// Dialog Data
	enum { IDD = IDD_ABOUTBOX };
 
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 
// Implementation
protected:
	DECLARE_MESSAGE_MAP()
};
 
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
 
 
// CQuadrotorControlDlg dialog
 
 
 
CQuadrotorControlDlg::CQuadrotorControlDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CQuadrotorControlDlg::IDD, pParent)
	, m_dblDesiredAltitude(0)
 
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
 
void CQuadrotorControlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_InfoBox, m_editInfoBox);
	DDX_Text(pDX, IDC_DesiredAltitude, m_dblDesiredAltitude);
	DDX_Control(pDX, IDC_Altitude, m_editAltitude);
}
 
BEGIN_MESSAGE_MAP(CQuadrotorControlDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_Stop, &CQuadrotorControlDlg::OnBnClickedStop)
	ON_BN_CLICKED(IDC_Reach, &CQuadrotorControlDlg::OnBnClickedReach)
END_MESSAGE_MAP()
 
 
// CQuadrotorControlDlg message handlers
 
BOOL CQuadrotorControlDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
 
	// Add "About..." menu item to system menu.
 
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
 
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
 
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
 
	// Extra initialization here
	m_dblDesiredAltitude=0;
	UpdateData(0);
	AfxBeginThread(AltitudeShow,0);
 
	return TRUE;  // return TRUE  unless you set the focus to a control
}
 
void CQuadrotorControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}
 
// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
 
void CQuadrotorControlDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
 
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
 
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}
 
// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CQuadrotorControlDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
Thread.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include "QuadrotorControl.h"
#include "QuadrotorControlDlg.h"
#include "afxdialogex.h"
#include "Variables.h"
 
UINT AltitudeShow(LPVOID lParam)
{
	int i=0;
 
	while(true)
	{
	i++;
	CString CAlt ;
	CAlt.Format(_T("%d"),i);
	CQuadrotorControlDlg::m_editAltitude.ReplaceSel(CAlt); 
 
	}
 
	return(0);
}
Le code d'erreur est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
QuadrotorControlDlg.obj : error LNK2001: unresolved external symbol "public: static class CEdit CQuadrotorControlDlg::m_editAltitude" (?m_editAltitude@CQuadrotorControlDlg@@2VCEdit@@A)
Donc apparemment le fait de modifier la variable m_editAltitude dans le thread pose un probleme car elle est déja déclarée dans le DoDataExchange?
Est ce un probleme de code, ou de paramètrage du linker?