V
vol4ek88
Всем доброго времени суток. Есть код
все работает просто замечательно, НО... Если код прогресс бара генерит мастер приложений, потоковая функция не видит переменную прогресс бара. Вроде потому, что функция статическая. А нестатическая вообще работать отказывается, компилятор никаких ошибок не дает, собирается отлично. Может кто-нибудь сталкивался с такой проблемой.
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;
}
все работает просто замечательно, НО... Если код прогресс бара генерит мастер приложений, потоковая функция не видит переменную прогресс бара. Вроде потому, что функция статическая. А нестатическая вообще работать отказывается, компилятор никаких ошибок не дает, собирается отлично. Может кто-нибудь сталкивался с такой проблемой.