|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.03.2011, 15:50 | #1 |
Регистрация: 10.02.2011
Сообщений: 6
|
Потоки, VCL и сеть
Код:
Вроде бы в не главном потоке не очень корректно обращ-я к элементам формы, наверно поэтому замечал у себя что в memo главной формы выво-я не вся обработанная информация. Я вот и попробовал(не знаю так это делать или нет) создать TNewThread.Memo1 и TNewThread.Memo2 и синхронизировать главной и дочерний потоки. Скажите пожалуйста это так или нет делается? Как скажем быть с stroka[(form7.combobox1.ItemIndex+1)]:=stroka[(form7.combobox1.ItemIndex+1)]+1; Тоже создавать процедуру и синх-ть с главным потоком? А если на форме очень много элементов (memo combobox label и тд)? Если скажем 20 компонентов label не писать же для каждой процедуру и синхронизацию? Заранее (если кто что понял в моей писание ) ) благодарен за ответ |
10.03.2011, 22:59 | #2 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
Код:
а в потоке использовать PostMessage. почитайте
программа — запись алгоритма на языке понятном транслятору
|
|
11.03.2011, 11:12 | #3 |
Регистрация: 10.02.2011
Сообщений: 6
|
evg_m
Да я читал, все равно скажем не очень понятно) Вот к примеру Data.Add('password='+form7.edit2.Te xt); Как эти строки корректно записать в потоке? Ну и строка Data.Add('password='+form7.edit2.Te xt); честно совсем не могу понять как корректно в потоке добавить в стринглист значение компонента(в данном случае edit2.text) // вот тут как я понял из вашего примера можно примерно так statemsg:=1; Synchronize(showMsg); ... statemsg:=3; Synchronize(showMsg); Data.Add('password='+edit); if pars('<status>', zapros,'</status>')='1' then begin statemsg:=2; Synchronize(showMsg); end; procedure Tthread.showMsg; begin //переменная statemsg вычисляется вне процедуры синхронизации case statemsg of 1: begin form7.Button1.Enabled:=false; form7.edit1.Text:='abc'; form7.edit2.Text:='def'; end; 2: begin stroka[(form7.combobox1.ItemIndex+1)]:=stroka[(form7.combobox1.ItemIndex+1)]+1; form7.memo2.Lines.Append(form7.comb obox1.Items[form7.combobox1.ItemIndex]+inttostr(stroka[(form7.combobox1.ItemIndex+1)])); end; 3:edit:=form7.edit2.Text; end; else memoX.lines.add('что делаю, что творю?'); end; end; Эта конструкция правильная? Если я все правильно понял можно скажем завести переенную statemsg, варировать в зависимости от того что мы делаем ее значениями и когда нужно к компонентам формы обратится делаем Synchronize(showMsg); и в процедуре в зависимости от того что нам надо уже идет обращение к компонентам формы или скажем вычисление какого-то значения и передача его в наш поток. |
11.03.2011, 12:09 | #4 | |||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
Цитата:
Код:
Код:
Цитата:
Но помните любой вызов Synchronize останавливает текущий поток до окончания работы процедуры указанной в параметре.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 11.03.2011 в 12:12. |
|||
13.03.2011, 02:22 | #5 |
Регистрация: 10.02.2011
Сообщений: 6
|
Спасибо, понятно в принципе все.
А вот скажем такая ситуация: Имее форму на ней компоненты edit и button. Допустим по нажатию на кнопку мы просто начинаем считаем от 1 до 100 ждем чего-то и записывать значение в edit. Вот решили мы это с помощью потока сделать. Мы на 100% уверены что в edit кроме нашего значения ничего не будет записываться. Сделали мы так: procedure Tthread.potok; begin case statemsg of 1: edit1.text:=inttostr(i); end; procedure TNewThread.Execute; begin for i:=1 to 100 do begin statemsg:=1; Synchronize(potok); sleep(10000); end; end; А могли так: procedure TNewThread.Execute; begin for i:=1 to 100 do begin edit1.text:=inttostr(i); sleep(10000); end; end; Что такого сверхординарного может произойти что наш 2-й вариант окажется не верным? |
13.03.2011, 04:55 | #6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
произойти может много чего, ведь Application в главном потоке продолжает получать и обрабатывать сообщения от Windows, которые, в том числе, вполне могут касаться и структур данных, связанных с edit1. Например, вашу форму с edit1 могли закрыть другим приложением, и в момент, когда ваш дополнительный поток пытается записать в него новый текст, windows запрашивает у VCL перерисовку edit1 из главного потока.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по VCL | Андрей 93 | Общие вопросы Delphi | 1 | 18.12.2010 18:46 |
Перлы VCL | Квэнди | Свободное общение | 7 | 13.02.2009 09:08 |
DynamicSkinForm VCL | TaTT DoGG | Компоненты Delphi | 4 | 01.05.2008 16:28 |
VCL | Э/\bФ_}{P | Свободное общение | 2 | 21.05.2007 00:21 |