Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

Изменение параметров потока...   Найти похожие ветки 

 
LyzD   (2003-04-26 18:10) [0]

Подскажите, плз...

Есть поток в нём есть массив... Время от времени от туда надо убирать информацию, или добавлять... Пробую сделать процедуру типа MyThread.Add(Param1,Param2);

Но при попытке обратиться к массиву... Выдается ошибка доступа...
Подскажите, как можно поступить в данной ситуации...


 
Palladin   (2003-04-26 18:37) [1]

TCriticalSections
TThreadList
и пр.


 
NetBreaker666   (2003-04-26 18:53) [2]

Конкретней можно ?


 
LyzD   (2003-04-26 19:38) [3]

Вобщем то поток необходим для запуска ряда прграмм с разными параметрами... Дело в том что сразу запускать их невозможно, т.к. можно попрощаться с системой... Она встает в ступор... пока что вышел из ситуации тем, что поставил Delay(15000), т.е. пауза между запусками 15 сек. Но приложений может быть до 10, поэтому на 2,5 минуты приложение встает... Хотелось бы чтобы этим занялся поток... Но передавать туда массив при создании не хочеться. Необходимо, чтобы он мог пополнять свой список программ к запуску...
Есть некоторая структура
TRecZapusk = record
ProgrammaZapusk: string;
ParammetriZapuska:string;
end;
В потоке есть неоторый массив
ParamZapuska: array of TRecZapusk;

Необходимо реализовать процедуру которой бы передавались параметры:
- программа
- параметры
которые она помещает в конец массива...


 
Palladin   (2003-04-26 19:55) [4]

глобальный для потоков TThreadList


 
NetBreaker666   (2003-04-26 20:17) [5]


> пока что вышел из ситуации тем, что поставил Delay(15000),
>

Плохой выход.
На самом деле, тебе здесь вообще второй поток не нужен... ну если уж сделал, то самый найлучший выход - создание второго массива, хотя можно и без него.
Запомни: писать в одну область памяти - некрасиво и часто приводит к глюкам. В массив ты пишешь из основного потока. Дополнительный поток только читает из него, и устанавливает флаги прочитанности. В этот момент основной поток заменяет прочитанные эл-ты непрочитанными или удаляет их, если они находятся в конце массива. Все циклы записи массива делаются for <...> to <...> , все циклы его чтения и записи флагов делаются for <...> downto <...>. Здесь можно обойтись без CriticalSection (что существенно увеличивает скорость). А если будешь использовать CriticalSection, то можно обойтись и без этих извращений.

TCell=record
Prg,Prm:String;
Read:Boolean;
end;
TCArray=Array of TCell;
TCQueue=class(TObject или TThread сразу)
arr:TCArray;
Len:Integer;//для чтения из дополнительного потока. Основной в нее пишет только после полного добавления нового элемента.
...
procedure Add(prg,prm:String);//Из основного потока
...
end;
...
procedure TCQueue.Add(prg,prm:String);
Begin
SetLength(arr,Len+1);
arr[Len].prg:=prg;arr[len].prm:=prm;arr[len].Read:=false;
inc(Len);
end;

procedure TCQueue.execute;
...
Begin
...
for i:=Len downto 0 do Begin
ExecuteProgram(Arr[i].prg,...);
Arr[i].read:=true;
Sleep(15000);
End;
End;


 
LyzD   (2003-04-26 20:36) [6]

В том то всё и дело, что у меня написанно тоже самое...

TRecZapusk = record
ProgrammaZapusk: string;
ParammetriZapuska:string;
end;
ArZapusk = array of TRecZapusk;

TTreadZapuska = class(TThread)
private
ParamZapuska: ArZapusk;
procedure Execute; override;
public
constructor Create();
published
procedure AddZapusk(var programm: string;var Param: string);
function CountProgramms(): integer;
end;

implementation

function TTreadZapuska.CountProgramms(): integer;
begin
Result := Length(ParamZapuska);
end;

procedure TTreadZapuska.AddZapusk(var programm: string;var Param: string);
var
Poz: integer;
begin
SetLength(ParamZapuska,Length(ParamZapuska) + 1);
Poz := Length(ParamZapuska);
ParamZapuska[Poz].ProgrammaZapusk := programm;
ParamZapuska[Poz].ParammetriZapuska := Param;
end;

Но при попытке работы с данным массивом выдается ошибка "... raised exception class EAccessViolation ...". Вообщем доступа он мне не дает...

А по поводу TThreadList я не совсем понимаю, как его сюда прикрутить...


 
Palladin   (2003-04-26 20:49) [7]

в модуле с описанием класса потока создаешь глобальную переменную

var
RunList:TThreadList;

из главной программы можешь постепенно, можешь сразу заполнить его значениями...

в execute потоков читаешь данные из RunList и исполняешь
после этого можешь запустить хоть 5 потоков, они сами разебрутся с доступом к RunList, твоя главная форма будет нормально реагировать на действия пользователя...

механизм отработки execute с RunList расписать? или сам?


 
LyzD   (2003-04-26 21:07) [8]

Спасибо, там я сам розберусь... А есть где-нибудь статья... Чтобы можно было поподробнее почитать, про взоимодействие между потоками через ThreadList...


 
NetBreaker666   (2003-04-26 21:08) [9]

Вот именно, что это не одно и тоже. Во-первых ты используешь countProgramms, которая вызвает Length (и может его вызвать прямо во время изменения длинны массива), во-вторых... fuck, щас влом расписывать, вообщем сделай как я сказал - сам увидишь


 
NetBreaker666   (2003-04-26 21:08) [10]

Вот именно, что это не одно и тоже. Во-первых ты используешь countProgramms, которая вызвает Length (и может его вызвать прямо во время изменения длинны массива), во-вторых... fuck, щас влом расписывать, вообщем сделай как я сказал - сам увидишь


 
Palladin   (2003-04-26 21:13) [11]

статья доступна по F1 :)


 
LyzD   (2003-04-26 21:37) [12]

Сейчас другая проблемма возникла...

При запуске поток усыпляется Suspend;

Но после помещения данных в ThreadList. Пытаюсь в главном потоке запустить поток запуска программ ThreadZapusk.Resume. В ответ приложение валится с ошибкой... :o((


 
Palladin   (2003-04-26 21:42) [13]

зачем suspend?
код давай


 
LyzD   (2003-04-26 21:53) [14]

Пардон... Нашел ошибку...


 
LyzD   (2003-04-26 22:17) [15]

Спасибо, за помощь... Все работает... :oD



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
3-23009
Trim
2003-04-17 16:43
2003.05.08
Database Workshop


1-23108
Matrex
2003-04-27 10:34
2003.05.08
Проблема работы с DLL под W2000


3-22958
Roman
2003-04-17 09:55
2003.05.08
Удаление записей запросом


1-23212
Sirus
2003-04-22 07:25
2003.05.08
Как отучить TToolButton из TToolBar уменьшаться в размерах?


8-23244
Сергей
2003-01-30 18:19
2003.05.08
Bitmap resample





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский