потоки в C++

Тема в разделе "MS Visual C++", создана пользователем vol4ek88, 11 сен 2011.

  1. vol4ek88

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

    vol4ek88 Гость

    кто-нибудь использует MFC
     
Загрузка...
Похожие Темы - потоки C++
  1. 203
    Ответов:
    4
    Просмотров:
    1.751
  2. Mady
    Ответов:
    3
    Просмотров:
    1.475
  3. Senset
    Ответов:
    0
    Просмотров:
    2.331
  4. Nadia_IT
    Ответов:
    0
    Просмотров:
    23
  5. kmm96
    Ответов:
    1
    Просмотров:
    24

Поделиться этой страницей