Главная страница
    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.49 MB
Время: 0.008 c
1-23163
IronHawk
2003-04-24 15:03
2003.05.08
Приветствую Мастеров! Как повесить событие на мышу когда она ...


3-22927
Falendysh
2003-04-20 02:22
2003.05.08
Настройки ODBC драйвера и BDE для работы с MySQL


3-22998
mic_2000
2003-04-17 11:30
2003.05.08
Массивы и хранимые процедуры в IB6


1-23127
Salvator
2003-04-27 21:51
2003.05.08
Работа с потоком


1-23135
Rocker
2003-04-28 10:25
2003.05.08
сохранение графики в файл...





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