Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.048 c
4-1101823960
Донской
2004-11-30 17:12
2005.01.23
broadcastsystemmessage и сервисы


3-1103183059
IgorV
2004-12-16 10:44
2005.01.23
Группировка в отчете


9-1097816409
WondeRu
2004-10-15 09:00
2005.01.23
GLSCENE: Textured HeightField


14-1104912807
syte_ser78
2005-01-05 11:13
2005.01.23
получение части стринговой переменной?


1-1104727124
DDDeN
2005-01-03 07:38
2005.01.23
Среда разработки в PE заголовке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский