Форум: "Основная";
Текущий архив: 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.008 c