Функция инициализации потока:
void
makeThreadConcate(void){
HANDLE
hThread;
DWORD
ThreadId;
BOOL
Active;
hThread =
CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)ConcateFiles,
(void*)&Active, 0, &ThreadId); // в
Active – состояние потока
while(Active == TRUE);
CloseHandle(hThread);
}
Функция сращивания трёх файлов: там же и управление контролом прогресс-бара с помощью сообщений.
extern HWND hwndDlgG;
DWORD WINAPI
ConcateFiles(LPVOID lpParam){
char
buffer[256]={'\0'};
HWND hEdit;
HANDLE hWriteFile, hReadFile1,
hReadFile2;
unsigned long dwBytesReadWrite=0;
signed short
WritedNumber1,WritedNumber2=0;
unsigned long Counter=0;
int
ProgressX=0;
////////////////////THREAD
SUITE//////////////////////////////////
BOOL *Active;
Active = (BOOL*)lpParam;
*Active = TRUE; // флаг
активности
потока
//////////////////////////////////////////////
hEdit =
GetDlgItem(hwndDlgG,4004);
GetWindowText(hEdit,(LPSTR)buffer,256);
CopyFile(buffer,"TensoCurve.ad",0);
hWriteFile
= CreateFile("TensoCurve.ad", GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
hEdit =
GetDlgItem(hwndDlgG,4002);
GetWindowText(hEdit,(LPSTR)buffer,256);
hReadFile1 = CreateFile(buffer, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
hEdit =
GetDlgItem(hwndDlgG,4005);
GetWindowText(hEdit,(LPSTR)buffer,256);
hReadFile2 = CreateFile(buffer, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
DWORD nSize = GetFileSize (hReadFile1, 0);
while(ReadFile(hWriteFile,
&WritedNumber1, 2, &dwBytesReadWrite, NULL)){
if (!dwBytesReadWrite) break;
}; // ищем
конец;
while(ReadFile(hReadFile1,
&WritedNumber1, 2, &dwBytesReadWrite,
NULL)&&ReadFile(hReadFile2, &WritedNumber2, 2,
&dwBytesReadWrite, NULL)){
if (!dwBytesReadWrite) break;
WriteFile(hWriteFile,&WritedNumber2
,2,&dwBytesReadWrite,NULL);
WriteFile(hWriteFile,&WritedNumber1
,2,&dwBytesReadWrite,NULL);
if(Counter*1000/(nSize>>1)!= ProgressX){
ProgressX=(int)(Counter*1000/(nSize>>1));
SendMessage(
GetDlgItem(hwndDlgG,4001), PBM_SETPOS, ProgressX, 0);
}
Counter++;
}; // ищем конец;
CloseHandle(hReadFile1);
CloseHandle(hReadFile2);
CloseHandle(hWriteFile);
SendMessage(
GetDlgItem(hwndDlgG,4001), PBM_SETPOS, 0, 0);
// обнуляем прогресс
//////////////////////////////////////////////////////////////
// Завершение потока
*Active = FALSE; // Сбрасываем флаг активности
ExitThread(0); // Специальный вызов для закрытия
потока
///////////////////////////////////////////////////////////////
return
0;
}
Вызов в static INT_PTR CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
static INT_PTR CALLBACK MainDlgProc(HWND
hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case
WM_INITDIALOG:
//инициализируем прогресс-бар
hProgress=
GetDlgItem(hwndDlg,4001);
SendMessage(hProgress,PBM_SETRANGE,
0, MAKELPARAM(0, 1000)); // максимальное
//значение прогресс-бара –
тысяча
SendMessage(hProgress, PBM_SETSTEP, 1, 0); // - шаг
прогресс-бара - единичка
SendMessage(hProgress, PBM_SETPOS, 0, 0); // ставим позицию
прогресс-бара
////////////////////////////////////////////////////////
return TRUE;
case WM_SIZE:
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDOK:
GetFileName(FileName,sizeof(FileName));
hEdit1 =
GetDlgItem(hwndDlg,4002);
if(*FileName!='\0')SendMessage(hEdit1, WM_SETTEXT,
0,(long)FileName); return TRUE;
case 4006:
GetFileName(FileName,sizeof(FileName));
hEdit1 =
GetDlgItem(hwndDlg,4005);
if(*FileName!='\0')SendMessage(hEdit1, WM_SETTEXT,
0,(long)FileName); return TRUE;
case 4007:
GetFileName(FileName,sizeof(FileName));
hEdit1 =
GetDlgItem(hwndDlg,4004);
if(*FileName!='\0')SendMessage(hEdit1, WM_SETTEXT,
0,(long)FileName); return TRUE;
//
EndDialog(hwndDlg, TRUE);
case 4008:
hwndDlgG = hwndDlg;
//THREADS
ROUTINE///////////////////////////////////
makeThreadConcate();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return TRUE;
}
break;
case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE;
}
return
FALSE;
}