Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

ИМЯ файла...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
1-1104992538
lightix
2005-01-06 09:22
2005.01.23
C++ Builder и Pascal


4-1102053755
Rext
2004-12-03 09:02
2005.01.23
Получение списка запущенных прочессов


1-1105226563
reaper
2005-01-09 02:22
2005.01.23
WebBrowser и ShellListView в одном окне


1-1105264235
гость
2005-01-09 12:50
2005.01.23
электрические схемы


1-1105423554
Лида
2005-01-11 09:05
2005.01.23
ComObj