Текущий архив: 2006.07.02;
Скачать: CL | DM;
Вниз
Правильное ведение лога с использованием нитей Найти похожие ветки
← →
learner © (2006-06-11 19:26) [0]Пытаюсь вести лог ошибок.
Никак не получаеться записывать с использованием нитей.
Пишет в файл ерунду. Я понимаю, что память, на которую ссылаеться нить
изменяется. Но почему и как это можно избежать ?function Str_AddToFileThread(const pValue:PChar):DWord; stdcall;
begin
Result:=0;
EnterCriticalSection(ERR_CS);
try
Str_AddToFile(TestFile,pValue); // Добавляет строку к файлу
finally
LeaveCriticalSection(ERR_CS);
end;
end;
procedure SetThreadError(const Mess:string);
var
ThreadHand, ThreadID:DWord;
begin
try
ThreadHand:=CreateThread(nil,0,@Str_AddToFileThread,PChar(Mess),0,ThreadID);
if ThreadHand<>0 then CloseHandle(ThreadHand);
finally
end;
end;
procedure Test;
var
i:integer;
begin
for i:=0 to 1000 do
SetThreadError("string"+IntToStr(i)); // Пишет ерунду
// Str_AddToFile(TestFile,"string"+IntToStr(i));// Пишет нормально
end;
← →
Dmitrij_K (2006-06-11 22:00) [1]Ну например так
function Str_AddToFileThread(const pValue:PChar):DWord; stdcall;
begin
Result:=0;
//EnterCriticalSection(ERR_CS);
try
// Str_AddToFile(TestFile,pValue); // Добавляет строку к файлу
finally
// LeaveCriticalSection(ERR_CS);
StrDispose(pValue)
end;
end;
procedure SetThreadError(const Mess:PChar);
var
ThreadHand, ThreadID:DWord;
begin
try
ThreadHand:=CreateThread(nil,0,@Str_AddToFileThread,Mess,0,ThreadID);
if ThreadHand<>0 then CloseHandle(ThreadHand);
finally
end;
end;
procedure Test;
var
i:integer;
p:PChar;
s:sTRING;
begin
for i:=0 to 1000 do
begin
s := "string"+IntToStr(i);
p := StrNew(PChar(s));
SetThreadError(p); // Пишет ерунду
end;
end;
← →
learner © (2006-06-11 23:24) [2]Dmitrij_K (11.06.06 22:00) [1]
Получилось.
Спасибо бльшое !
Страницы: 1 вся ветка
Текущий архив: 2006.07.02;
Скачать: CL | DM;
Память: 0.44 MB
Время: 0.009 c