Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с блокировкой файлов 
:(
    Опции темы
leadbelly
Дата 1.8.2007, 07:33 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}


PM MAIL   Вверх
Dronchik
Дата 1.8.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: нет
Всего: 37



Во первых пользуйся кнопкой "код" на свой код. Во вторых весь свой проект лучше заархивируй и присоедени к сообщению. 


--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
leadbelly
Дата 1.8.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



исходный код тестового примера VS2005

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  test_arj.rar 9,20 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.