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

Вниз

Универсальный Thread !!!   Найти похожие ветки 

 
Maksim   (2002-07-06 12:28) [0]

Доброго времени суток всем!
Есть задача создать универсальную процедуру с помощью которой можно будет запускать любую функцию или процедуру в отдельном потоке, что то вроде
MyUniversalThread(ListView1.Clear);
MyUniversalThread(LoadList);

LoadList тоже какая нить долгая процедура к-рая тормозит всю прогу.
Мои долгие попытки ни к чему не привели, и вот обращаюсь к вам Мастера.
Заранее благодарен.
Максим.


 
MBo   (2002-07-06 12:42) [1]

MyUniversalThread(ListView1.Clear);
Так нельзя. Действия с Control-ами должны выполняться только в основном потоке.


 
asmer   (2002-07-06 15:04) [2]

-= for MBo =-
потоками можно работать с контроллами, созданными с вин32апи... а VCL не имела изначально свойство повторной входимости, однако с эндцатой версией (не помню, по-моему с четвёртой) есть какие-то средства синхронизации, позволяющие реализовывать многопоточность с VCL-функциями... типа, я на делфи щас не пишу, поентому не помню конкретно ентот вопрос, помню только, что енто проблематично... :) а прочитал об ентом в здоровом двухтомнике про делфи, названия и автора тож не помню :) типа, просто для сведения грю, практической пользы с моего текста - NULL... :)


 
MBo   (2002-07-06 15:36) [3]

>asmer
Весьма благодарен за полную и ценную информацию.

Составители французской энциклопедии спросили Ж.Кювье (известный биолог-систематик)- как вам наше определение:
Рак- это небольшая красная рыба, которая ходит задом наперед.
Кювье ответил: Определение великолепное, есть только мелкие замечания - рак не рыба, он не красный, и не ходит задом наперед.
Все остальное точно.




 
asmer   (2002-07-06 15:51) [4]

мбо -> не в тему...
хех, чувствуется, удалит меня модератор :)


 
serd_hhc   (2002-07-06 18:27) [5]

2MBo>
Шорошо сказано...


 
asmer   (2002-07-07 07:32) [6]

Действия с Control-ами должны выполняться только в основном потоке
...а я грю, что можно не в основном!.. неужели енто аналогично ответу кювье?.. может, у вас какая-то особая, "программистская", логика?..


 
MBo   (2002-07-07 12:17) [7]

http://www.pergolesi.demon.co.uk/prog/threads/Ch3.html


 
Bachin   (2002-07-07 14:39) [8]

не ссорьтесь горячие парни! :)

type
TForm1 = class(TForm)
ListView1: TListView;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Add100000Items;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Add100000Items;
var
i: integer;
begin
for i := 0 to 99999 do
Form1.ListView1.AddItem( IntToStr(i), Nil );
end;

procedure TForm1.Button1Click(Sender: TObject);
var
p: Pointer;
t: Cardinal;
begin
p := MakeProcInstance( @TForm1.Add100000Items, 0 );
CreateThread(Nil, 0, p, Nil, 0, t);
FreeProcInstance(p);
end;

end.


 
asmer   (2002-07-07 15:14) [9]

Bachin -> тока вот енто просто так, видимо, иногда будет выдывать ошибки... если, например. ты кнопку второй раз нажмёшь не вовремя, или каким-нить ещё способом попытаешься повлиять на содержимое ListView1... я ж грю, в библиотеке есть какие-то средства синхронизации, позволяющие многопоточность, но сами по себе они не работают...


 
Bachin   (2002-07-07 15:56) [10]

2asmer>
Я не понял вопроса! В чем проблемма то?
одновременный доступ к объекту? так при чем здесь VLC!?
я так понял, что обновная проблема была запустить в
потоке функцию объекта, а не обычную.
Как это делается я написал, а синхронизацию НИКТО
за тебя не сделает... Тут как говорится и флаг в руки -
хочешь критикал секции делай, хачешь - заведи свою переменную :)


 
[NIKEL]   (2002-07-07 18:04) [11]

для того чтоюы позволить потокам доступ к объектам библ. VCL , в объекте TThread предусмотрен метод Synchronize , он выполняет действи, которые находятся в подпрограмме так, как если бы они выполнялись из основного потока VCL...
может поможет...


 
Новенький в Делфи   (2002-07-08 01:44) [12]

... ээ я не много по борзею... и в лезу в разговор мастеров :)

Насколько я понял вопрос, он заключался в том что бы создать универсальную процедуру, которая бы запускала другие баальшие процедуры в отдельном потоке (хотя я смысла в этом не вижу).

Но Synchronize() тут не подходит.. так как этот метод будет выполнять другие процедуры в основном потоке, тоесть смысл отдельного потока исчезает.



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

Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
3-26887
harismatik
2002-08-16 13:11
2002.09.09
Если пропадает связь клиента с сервером...


14-27168
EAlexander
2002-08-13 13:19
2002.09.09
.Net


8-27125
Roksolan
2002-05-05 19:16
2002.09.09
Печать растров в реальных размерах


1-26963
dolea
2002-08-29 13:30
2002.09.09
ПРОВЕРКА НАЛИЧИЯ ДИСКЕТЫ В ДИСКОВОДЕ


3-26870
Ренат
2002-08-19 14:51
2002.09.09
Часть поля в запросе





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