потоки в C++

  • Автор темы vol4ek88
  • Дата начала
V

vol4ek88

Гость
#1
Всем доброго времени суток. Есть код


C++:
fDlg.cpp : файл реализации
//

#include "stdafx.h"
#include "f.h"
#include "fDlg.h"
#include "afxdialogex.h"
#include <windows.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "thread.h"
// диалоговое окно CfDlg
int i,j;
CProgressCtrl cProgress;

CfDlg::CfDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CfDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CfDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_PROGRESS1, cProgress);
}

BEGIN_MESSAGE_MAP(CfDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDCANCEL, &CfDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDOK, &CfDlg::OnBnClickedOk)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_PROGRESS1, &CfDlg::OnNMCustomdrawProgress1)
END_MESSAGE_MAP()

static UINT progress(LPVOID param)			// потоковая функция
{
{
HANDLE hFile = CreateFile(path,GENERIC_READ,NULL,NULL,OPEN_ALWAYS,NULL,NULL);
HANDLE hhFile = CreateFile(L"file.txt",GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);

DWORD dwBytesRead, dwBytesWritten;
char * buffer[4096];

do 
{

if (ReadFile(hFile, buffer, 4096, 
&dwBytesRead, NULL)) 

i = GetFileSize(hFile,NULL)/10000;
{

WriteFile(hhFile, buffer, dwBytesRead, 
&dwBytesWritten, NULL); 
j = GetFileSize(hhFile,NULL)/10000;
} 

cProgress.SetRange(0,i);
cProgress.SetPos(j);
} 

while (dwBytesRead == 4096); 


CloseHandle(hFile);
CloseHandle(hhFile);


}

return 0;
}


BOOL CfDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Задает значок для этого диалогового окна. Среда делает это автоматически,
// если главное окно приложения не является диалоговым
SetIcon(m_hIcon, TRUE);			// Крупный значок
SetIcon(m_hIcon, FALSE);		// Мелкий значок


CreateDirectory(L"BIN",NULL);
CWnd* TheWindow=GetActiveWindow();
CFileDialog fd(true,NULL,NULL,OFN_ALLOWMULTISELECT+
OFN_HIDEREADONLY,NULL,TheWindow);	


if (fd.DoModal()==IDOK)
{
path = fd.GetPathName(); // Определяет полный путь файла 
}

return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}



void CfDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Выравнивание значка по центру клиентского прямоугольника
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;


dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
// свернутого окна.
HCURSOR CfDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}



void CfDlg::OnBnClickedCancel()
{
CDialogEx::OnCancel();
}


void CfDlg::OnBnClickedOk()
{
AfxBeginThread(Play,this,NULL,NULL,THREAD_PRIORITY_IDLE);
AfxBeginThread(progress,this,NULL,NULL,THREAD_PRIORITY_IDLE);	
WritePrivateProfileString(L"file",L"add",path,L"BIN\\file.ini");
}



void CfDlg::OnNMCustomdrawProgress1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

*pResult = 0;
}
все работает просто замечательно, НО... Если код прогресс бара генерит мастер приложений, потоковая функция не видит переменную прогресс бара. Вроде потому, что функция статическая. А нестатическая вообще работать отказывается, компилятор никаких ошибок не дает, собирается отлично. Может кто-нибудь сталкивался с такой проблемой.