Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизИМЯ файла... Найти похожие ветки
← →
GanibalLector © (2005-01-03 17:33) [0]Есть поток,в котором через OLE вызываю Word и создаю документы.После создания,сохраняю его по некоторому пути.
Из основного потока,дожидаюсь завершения второго(того,что с Word-ом работает) и запускаю как отдельный процесс,после этого пользователь наслождается.
Так вот,проблема в имени файла,который сохраняется,а потом запускается.Да,я знаю,что можно в реестре(ини) хранить некоторое значение,наращивать его и т.д.
Но так не хочется!!!Это ж надо заводить переменные,связываться с реестром.ФИ!!!
Вы не подумайте,это могу это сделать элементарно в считанные минуты,но,ХОТЬ УБЕЙТЕ,не хочу я лишних переменных и прочей чепухи.
Может как-то замутить со временем или еще как-то???
З.Ы.Да,забыл,сегодня употреблял...
← →
Fay © (2005-01-03 17:44) [1]> наслождается
Вредно столько пить 8)
> Может как-то замутить со временем или еще как-то???
Уточните, в чём именно проблема. Я сегодня ещё не употреблял, поэтому никак не могу понять.
← →
GanibalLector © (2005-01-03 17:52) [2]Хорошо,продолжу.
Мне необходимо придумать алгоритм,который бы УНИКАЛЬНО называл выходные файлы.
Например :
-создаю вт.поток,который создал документ и сохранил "Вася_Пупкин1.doc"
-вт.поток помер
-из основного потока пошел CreateProcess с параметром "Вася_Пупкин1.doc"
Надеюсь так понятно...
← →
Sandman25 © (2005-01-03 17:58) [3]Я делаю так - создаю файл по шаблону, имя файла генерируется автоматически самим вордом. После заполнения файла показываю ворд, активирую его, отключаю все Ole-соединения, но ворд не закрываю. Пользователь оказывается в ворде
← →
Александр Иванов © (2005-01-03 17:59) [4]По дате и времени (до милисекунды) называй и будет уникально.
← →
GanibalLector © (2005-01-03 18:04) [5]>Я делаю так - создаю файл по шаблону, имя файла генерируется автоматически самим вордом. После заполнения файла показываю ворд, активирую его, отключаю все Ole-соединения, но ворд не закрываю. Пользователь оказывается в ворде
У меня так и было...Так нельзя!!!Возникают ошибки,довольно таки часто,которым нет обьяснений.Хотя на некоторых машинах,все отлично.Вот поэтому и замутил с сохранением и открытием отдельным процессом.
>По дате и времени (до милисекунды) называй и будет уникально
Да,но!!!Два разных потока.Когда я создал файл,я дожидаюсь завершения потока в основном потоке...а это время.
← →
GanibalLector © (2005-01-03 18:08) [6]Хотя...может получить все файлы и найти с максимальной датой и временем. Наверно так и поступлю ;)
← →
GuAV © (2005-01-03 18:13) [7]А почему бы не запомнить имя из сохранившего потока в глобальную переменную потом прочитать его оттуда ?
← →
GanibalLector © (2005-01-03 18:17) [8]2 GuAV [7]
Не люблю я глобальные переменные и реестр(ини) тоже.
Вот такой вот я ;)
← →
Fay © (2005-01-03 18:25) [9]В случае с "Вася_Пупкин" GetTempFilename (IMHO) не подойдёт 8(
Попробуй такfunction GetUnqName(const cPath, cPrefix, cExt : string; var n : Integer) : String;
var
h : THandle;
le : DWORD;
label
Labels_Rulezz;
begin
h := INVALID_HANDLE_VALUE;
try
goto Labels_Rulezz;
repeat
le := GetLastError;
if le <> ERROR_FILE_EXISTS then
raise Exception.Create(SysErrorMessage(le));
Inc(n);
Labels_Rulezz :
Result := Format("%s%s%d%s", [cPath, cPrefix, n, cExt]);
h := CreateFile(PChar(Result), 0, 0, nil, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
until h <> INVALID_HANDLE_VALUE;
finally
if h <> INVALID_HANDLE_VALUE then CloseHandle(h)
else Result := "";
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
s : string;
n : Integer;
i : Integer;
tc : DWORD;
h : DWORD;
begin
tc := GetTickCount;
n := 1;
for i := 0 to 999 do
begin
s := GetUnqName("c:\!!!!\", "Вася_Пупкин_", ".doc", n);
// Занять имя
h := CreateFile(PChar(s), 0, 0, nil, CREATE_NEW, 0, 0);
if h <> INVALID_HANDLE_VALUE then CloseHandle(h);
end;
ShowMessage(Format("%d ms", [GetTickCount - tc]));
end;
← →
GuAV © (2005-01-03 18:32) [10]GanibalLector © (03.01.05 18:17) [8]
Про реестр/ини солидарен, а вот про глобальные переменные зря. Поток TThread или BeginThread ?
← →
GanibalLector © (2005-01-03 18:42) [11]2 GuAV
Все исключительно на АПИ(по совету Цифрочеловека).Примерно,так :
function potok(Param: Pointer): DWord; stdcall;
begin
//KOD
Result:=0;
exitthread(Result);
end;
// вызываю так :
CreateThread(nil,0,@potok,nil,0,ThreadID);
2 Fay
Спасибо,ща гляну...Хотя,мне код-то не нужен,я алгоритм просил.
← →
Fay © (2005-01-03 18:44) [12]2 GanibalLector © (03.01.05 18:42) [11]
> Хотя,мне код-то не нужен,я алгоритм просил
Лениво было на русский переводить, честно 8)
← →
GuAV © (2005-01-03 19:01) [13]2 GanibalLector © [11]
с TThread можно было бы добавить поле в свой класс.
Раз как сейчас, тогда можно вернуть строку в коде возврата потока.
Result:=DWORD(StrNew(FileName));
или
New(PResultRec(Result)); где
type
PResultRec = ^TResultRec;
PResultRec = record
FileName: string
end;
Кстати, напоминаю про IsMutliThread - ниаче работать не будет.
Result:=0; exitthread(Result); излише. достаточно exitthread(0) или Result:=0;.
← →
Fay © (2005-01-03 19:27) [14]2 GuAV © (03.01.05 19:01) [13]
>type
> PResultRec = ^TResultRec;
> PResultRec = record
> FileName: string
> end;
Я что, PChar (к примеру) уже отменили?
← →
Fay © (2005-01-03 19:28) [15]"Я что" = "А что" 8)
← →
Fay © (2005-01-03 19:34) [16]Если создающих файлы потоков несколько, то можно завести переменную (не обязательно глобальную) для счетчика (Вася_Пупкин_N), которую видно из разных потоков, а обращение к ней защитить критической секцией. Я бы так сделал.
← →
GanibalLector © (2005-01-03 19:44) [17]2 GuAV [13]
>Раз как сейчас, тогда можно вернуть строку в коде возврата потока.
Result:=DWORD(StrNew(FileName));
Это понятно,а как посмотреть-то на Result ???Скажем вывести на Caption.Что-то не могу понять...
Fay [16]
>Если создающих файлы потоков несколько
Не,один
← →
Fay © (2005-01-03 20:33) [18]2 GanibalLector © (03.01.05 19:44) [17]
> Не,один
Ну так здорово! Так ведь?
← →
GuAV © (2005-01-03 20:56) [19]GanibalLector © (03.01.05 19:44) [17]
Это понятно,а как посмотреть-то на Result ???Скажем вывести на Caption.Что-то не могу понять...
GetExitCodeThread
и освободить не забыть.
Кстати преимущестов в том, что с каждым Thread связана своя структура в отл от глобальной переменной.
Fay © (03.01.05 19:27) [14]
Нет. Первый кусок кода после или в [13]
← →
GanibalLector © (2005-01-03 21:10) [20]2 GuaV
В общем все получилось,спасибо.Еще вопросик...
Я всегда думал,чтоResult:=0;
exitthread(Result);
завершает поток.Т.е.нуль ОБЯЗАТЕЛЬНО.
А получается,что туда хоть черта можно засунуть и поток все равно завершится.Что скажешь???
З.Ы.Я просто по англ.читать не могу...посему и спрашиваю.
← →
GuAV © (2005-01-03 21:19) [21]GanibalLector © (03.01.05 21:10) [20]
На самом деле туда можно засунуть любое значение.
Только если используется проверка на STILL_ACTIVE, то использовать это значение с осторожностью. Однако, STILL_ACTIVE = $00000103 никогда не будет валидным указателем, поэтому тут IMHO всё чисто.
я рекомендую использовать BeginThread/EndThread заместо CreateThread/ExitThread.
← →
GanibalLector © (2005-01-03 21:22) [22]>я рекомендую использовать BeginThread/EndThread заместо CreateThread/ExitThread
А почему?Мотивируй,если не сложно...
З.Ы.В исходниках Мистика я видел такие фокусы ;)
← →
GuAV © (2005-01-03 21:50) [23]Следует использовать RTL функции управления потоками, т.к. имеются различия между одно- и многопоточным управлением памятью. BeginThread также устанавливает Corpocesssor Control Word.
Можно конечно установить IsMultiThread вручную. Однако это implementation-specific трюк. В справке по IsMultiThread написано что она устанавливается BeginThread, но нет ничего про установку вручную.
Кстати, видимо это касается не только Delphi. Из MSDN:
"A thread that uses functions from the C run-time libraries should use the beginthread and endthread C run-time functions for thread management rather than CreateThread and ExitThread. "
PS: если перейдёшь на BeginThread не забудь убрать stdcall
← →
Fay © (2005-01-04 07:12) [24]2 GuAV © (03.01.05 21:50) [23]
А что даёт IsMultiThread? В исходниках он упоминается только какIsMultiThread := True
. Я никогда его не использовал и проблем не было - что я делаю не так, как получить траблы?
← →
GuAV © (2005-01-04 12:24) [25]Fay © (04.01.05 7:12) [24]
Если все потоки создаешь через BeginThread или наследника TThread, то проблем и не будет.
Эта переменная указывает менеджеру памяти что приложение многопоточно. Обращения к куче в этом случае защищены крит секцией - см. ($Delphi7)\Source\Rtl\Sys\getmem.inc
← →
GanibalLector © (2005-01-05 02:10) [26]Епрст...не слов,одни маты.
Вот,сделал...из потока сохраняю в файл,поток умирает,жду смерти потока из основного потока программы и запускаю этот файл.
И опять,это гребанное сообщение про Normal.dot.Я ж его не трогаю...
З.Ы.Скажите,а может ли такое случиться,если некоторые хендлы(или еще чего) не закрыты???
← →
GuAV © (2005-01-05 02:13) [27]Проверь и файл и нормал.дот на наличие макросов. их там біть не должно, кроме тех, что сам добавил.
← →
GanibalLector © (2005-01-05 02:22) [28]>Проверь и файл и нормал.дот на наличие макросов.
Извини за LOL,но что-то не пойму как? КаШпировский молчит.
> кроме тех, что сам добавил
Не,я такого не делал.
З.Ы.Ах да,забыл сказать,на этой машине,которая с этим сообщением стоит РУТА-ПЛАЙ(ну,переводчик рус.-укр.).Может из-за этого?
← →
GuAV © (2005-01-05 02:30) [29]
> З.Ы.Ах да,забыл сказать,на этой машине,которая с этим
> сообщением стоит РУТА-ПЛАЙ(ну,переводчик
> рус.-укр.).Может из-за этого?
IMHO, запросто.
GanibalLector © (05.01.05 2:22) [28]
Извини за LOL,но что-то не пойму как? КаШпировский молчит.
Сервиз->Макрос->Редактор VB.
см. Normal, Project на наличиеPrivate Sub Document_Close()
Private Sub Document_New()
Private Sub Document_Open()
Также ищи там свою Руту.
← →
GanibalLector © (2005-01-06 01:18) [30]2 GuAV © [29]
>IMHO, запросто.
Прикинь,это и было.Удалил ProLing(так вроде назывался) и наступило долгожданное счастье
← →
Fay © (2005-01-06 07:54) [31]2 GuAV © (04.01.05 12:24) [25]
Да, что-то я не догадался поискать по inc-ам.
А почему в исхолниках не встречается IsMultiThread := False ? Это юмор такой?
← →
GuAV © (2005-01-06 18:24) [32]Fay © (06.01.05 7:54) [31]
А почему в исхолниках не встречается IsMultiThread := False ? Это юмор такой?
А когда Вы предлагаете его установить обратно в False ? В каком месте кода ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.071 c