![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| leadbelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
есть некая задача которой надо
запускать много внешних программ и вот на двухпоцессорной тачке эта программа чудит при большой загрузке специально сварганил тестовый пример при запуске на селероне все замечательно а уже на пентиуме с HT архиватор глючит причем опутным пуетм установлено что блокируется доступ к файлу x1.txt если раскоментарить // test_acces(dir+_T("\\x1.txt")); все работает чудесно но как то не красиво получается как добиться идеала ? // test_arj.cpp : Defines the entry point for the console application. // #include "stdafx.h" //#include "test_arj.h" #include "process.h" #include "conio.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // The one and only application object CWinApp theApp; using namespace std; void sys_err_msg(DWORD err) { LPVOID lpMsgBuf; CString s; DWORD len_f=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); ((TCHAR*)lpMsgBuf)[len_f]=0x0; s=(LPCTSTR) lpMsgBuf; MessageBox(NULL,s,_T(""),MB_OK|MB_SYSTEMMODAL); LocalFree( lpMsgBuf ); _exit(-1); } CString frm(int a) { //CString s; //s.Format("%i", a); //char buf[FRM_BUF]; TCHAR buf[64]; try { _itot(a,buf,10); } catch(...) { buf[0]=0x0; } return buf; } BOOL test_acces(LPCTSTR f) { //проверка доступа уст атриб //if( !SetFileAttributes(f,FILE_ATTRIBUTE_NORMAL)) return false; DWORD err; HANDLE f1; for( int i=0; i < 10;i++) { f1=CreateFile(f,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL); if (f1 != INVALID_HANDLE_VALUE){ break;} // все открыл err=GetLastError(); if( err == 32) { //if( work.bDebug) printf("wait access %s\n",f); Sleep(500); continue; } break; } if (f1 == INVALID_HANDLE_VALUE) { //Error(1,sys_err_msg(err),"test_acces"); if( err == 32) { //Error(1,"Ошибка доступа к файлу — "+CString(f),"test_acces"); return false; } else return true; } //проверка доступа уст атриб //if( work.low_speed) // FlushFileBuffers(f1); CloseHandle(f1); return true; } void CheckKey( void *dummy ) { int num=(int)(_int64) dummy; CString dir=_T("tmp\\")+frm(num); if(!CreateDirectory(dir,NULL)) { DWORD err=GetLastError(); if( err != 183)sys_err_msg(err); } CStdioFile f(dir+_T("\\x1.txt"),CFile::modeCreate|CFile::modeReadWrite); f.WriteString(_T("test\n")); for(int y=0;y < 10000;y++) { f.WriteString(frm(rand())); } f.Flush(); f.Close(); while(1) { PROCESS_INFORMATION pi={0}; STARTUPINFO si = {0}; int rez=WAIT_FAILED; DWORD dwCreateFlags = CREATE_NO_WINDOW;// | si.lpDesktop=NULL; si.cb = sizeof(si); si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_SHOW; CString cmd=_T("arj.exe a -y ")+dir+_T("\\x1.arj")+_T(" ")+dir+_T("\\x1.txt"); // test_acces(dir+_T("\\x1.txt")); BOOL bOk = CreateProcess(NULL,(TCHAR*)(LPCTSTR) cmd, NULL, NULL, true, dwCreateFlags,NULL, NULL, &si, &pi ); if ( bOk ) { } else { sys_err_msg(GetLastError()); } rez=WaitForSingleObject( pi.hProcess ,INFINITE ) ; if( rez != WAIT_OBJECT_0) sys_err_msg(GetLastError()); DWORD status=0; if( !GetExitCodeProcess(pi.hProcess,&status)) sys_err_msg(GetLastError()); if((int)status != 0 ) { AfxMessageBox(_T("err arj — ")+frm(status)); //sys_err_msg(err); _exit(-1); } CloseHandle( pi.hThread ); CloseHandle( pi.hProcess ); } } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: MFC initialization failed\n")); nRetCode = 1; } else { CreateDirectory(_T("tmp"),NULL); for(int i=0;i < 10;i++) { _beginthread( CheckKey,0, (void*)(_int64)i ); } // TODO: code your application's behavior here. } printf(".....\n"); getch(); return nRetCode; } |
|||
|
||||
| Dronchik |
|
|||
![]() Звукач ёмаё ![]() ![]() Профиль Группа: Участник Сообщений: 451 Регистрация: 1.5.2007 Репутация: нет Всего: 37 |
Во первых пользуйся кнопкой "код" на свой код. Во вторых весь свой проект лучше заархивируй и присоедени к сообщению.
-------------------- Вместо слов делай дело, от которого ты фанатеешь. (с) |
|||
|
||||
| leadbelly |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
исходный код тестового примера VS2005
Присоединённый файл ( Кол-во скачиваний: 3 )
test_arj.rar 9,20 Kb |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |