Перейти к содержанию
  • Регистрация

gonzales

Пользователи
  • Публикаций

    170
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

gonzales стал победителем дня 25 марта

gonzales имел наиболее популярный контент!

Информация о gonzales

  • Звание
    Продвинутый пользователь

Посетители профиля

799 просмотров профиля
  1. аа, точно, спасибо. чего-то затупил. Правильно вот так procedure TSplashForm.FormCreate(Sender: TObject); var f: TForm1; begin AniIndicator1.Enabled := True; AniIndicator1.Visible := True; b1.Visible := false; TTask.Run( procedure begin datamodel.ObtainData; TThread.Synchronize(nil, procedure begin AniIndicator1.Enabled := false; AniIndicator1.Visible := false; b1.Visible := True; lbl1.Text := datamodel.data1; lbl2.Text := datamodel.data2; f := TForm1.Create(NIL); f.Show; end) end); end;
  2. продолжаю разбираться. вернулся обратно к коду, предложенному уважаемым krapotkin Хочу внести одно изменение, чтобы форма1 создавалась в процедуре TMyDatamodel.ObtainData procedure TMyDatamodel.ObtainData; var tasks: array of ITask; task: ITask; f: TForm1; procedure CreateTasks; begin tasks := [ TTask.Create(procedure () begin sleep(2000); data1:='data1'; end), TTask.Create(procedure () begin sleep(2000); data2:='data2'; f:=TForm1.Create(NIL); form1.Show; end) ]; end; begin CreateTasks; for task in tasks do task.start; TTask.WaitForAll(tasks); end; В одну из задач воткнул создание формы, при этом приложение отрабатывает не корректно. Получаю AccessViolation на этапе form1.show. Подозреваю, что проблема в том, что форма создана в потоке. Перебросил form1.show в SplashForm.FormCreate, ошибок нет, но и форма не показывается. procedure TSplashForm.FormCreate(Sender: TObject); begin AniIndicator1.Enabled := True; AniIndicator1.Visible := True; b1.Visible := false; TTask.Run( procedure begin datamodel.ObtainData; TThread.Synchronize(nil, procedure begin AniIndicator1.Enabled := false; AniIndicator1.Visible := false; b1.Visible := True; lbl1.Text := datamodel.data1; lbl2.Text := datamodel.data2; form1.Show; end); end); end; Что я делаю не так??)))
  3. Чего Вы привязались к прогрессбару, это никак не связано с потоками, я просто уточнял, нужно ли обращаться к форме, созданной в потоке через синхронизацию. Прочитайте посты выше, вроде как уже больше недели это обсуждаем. У вас очень странное представление о UI. Вы правда считаете, что я демонстрирую пользователю одновременно Сплэш, две формы, и повергающий его в экстаз прогрессбар??
  4. На форуме обсуждал в соседней ветке. Я хочу открыть соединение с сервером и получать в него данные, пока живо приложение. Соответственно, было бы здорово, если бы все эти манипуляции происходили бы в потоке, отдельно от форм. Поэтому рассматриваю вариант, когда поток стартует вместе с приложением, и живет все время. Ну и заодно хочу забросить в него все остальное. А почему не следует так делать?
  5. Тогда как посоветуете поступить. Есть класс (условно TSystem), который содержит кучу свойств и методов для работы приложения (всю логику). Там и все структуры, и работа с XML, и работа с TCP-клиентом. Задача: развязать работу экземпляра этого класса с формой. Как Вы и советовали, логика отдельно, интерфейс отдельно. Я (по наивности наверное) думал, что если этот класс будет типа TThreat, то он автоматом будет работать в новом потоке, но судя по Вашим комментариям - это не так. В методе TSystem.Execute у меня пока зашит пока только прием данных от TCP-клиента. Как правильно организовать работу, чтобы все методы класса TSystem выполнялись в отдельном потоке, и при этом я мог их запускать из основного потока. Например есть метод TSystem.SendMessage, если я обращаюсь к нему с главной формы, в каком потоке он будет выполнен? Извините, что (скорее всего) задаю тупые вопросы, но обратиться больше не к кому))). Заранее спасибо за любые ответы.
  6. Спасибо! Не могли бы Вы прокомментировать еще мой пост выше
  7. И еще, если я в своем классе TThread создаю форму для отображение прогресс бара application.CreateForm(TForm27, Form27); Form27.ProgressBar1.Max := highbyte + 1; Form27.ProgressBar1.value := 0; Form27.StartUpLabel.text := inttostr(filesize); Должен я обращаться к ней через синхронизацию?
  8. Че то я опять запутался))) Допустим я создал свой класс типа Tthreat, в котором у меня крутится вся логика. В частности есть public свойства SettingsXML - XMLDocument и settingsfilename - поле для хранения пути к файлу настроек. Далее я создаю экземпляр этого класса, который находится на form1. form1.SystemClient:= TSystemClient.Create; При этом экземпляр же находится в главном потоке? При вызове вот такого метода, в каком потоке он будет выполняться? form1.SystemClient.SettingsXML.LoadFromFile(form1.SystemClient.settingsfilename);
  9. Да, забыл указать, форме присваиваем FullScreen = true, чтобы стрыть шторку и системные кнопки, если они экранные.
  10. Тоже столкнулся с необходимостью запретить пользователю нажимать на кнопку Домой. Нашел достаточно простое решение (для себя), заставить приложение быть Лаунчером, при этом доступна шторка и кнопка включения. Но основные фишки работают: после перезагрузки автоматически стартует моя программа, она не висит в списке задач, ее нельзя выгрузить, не работает кнопка Домой. Суть в изменении манифеста. В файле AndroidManifest.template.xml находим строки <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> И добавляем <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> Пересобираем приложение, запускаем. На 6-ом Андроиде при нажатии на кнопку Домой система предложит выбрать Лаунчер, выбираем нашу программу и нажимаем Всегда. Чтобы изменить, через шторку входим в настройки - выбор системного интерфейса. На 8-ом Андроиде также через настройки принудительно выставляем лаунчер на нашу программу.
  11. Подскажите еще пожалуйста, если я сделаю свой класс типа TThread, я же могу из него запустить еще один новый поток для каких-то побочных задач?
  12. Спасибо! До меня начало доходить, нужно полностью отойти от метода программирования, когда в коде основной формы пишутся все процедуры и функции, все выносить в отдельные юниты, в которых в потоках (потоке) обрабатывается вся логика и лишь через синхронизацию выдает информацию в главный поток. А главный поток по сути свободен, занят лишь перерисовкой форм и получением событий мыши.
  13. Ну да уж))) Я читал этот Ваш пост и вот этот http://www.cyberforum.ru/blogs/469693/blog4909.html, натыкался на него еще до этого обсуждения. Тем не менее я считаю, что использование ProcessMessages в простых случаях оправдано. Ведь это ни что иное, как изменение приоритетов процессов, например когда нужно просто перерисовать форму, с помощью ProcessMessages останавливаем текущий процесс и запускаем процессы в очереди. Но это сугубо ИМХО. Зачем было убирать его мне не понятно, хочешь используй, не хочешь - не используй, делай костыли, как предложил IS1 со слипами, потоками и прочими радостями. С потоками мне все понятно, сам их активно использую, например при раскодировании изображений с ip-камер. Но как их использовать, когда есть очередность действий в главном потоке? Не сочтите за труд, я думаю это многим было бы интересно, покажите, как переписать пример выше используя Вашу концепцию.
  14. Прошу прощения за долгое отсутствие Вот накидал простой исходникtest10.3.zip. В проекте 3 формы, первой создается SplashForm. Остальные формы имеют в OnCreate высоконагруженные вычисления, поэтому после каждого создания формы отображаю на SplashForm статус формы. Дабы все это отрисовывалось использую Application.processmessages.
  15. sleep здесь исключительно для наглядности, и вообще весь код. Реальная задача: имеется окно заставки, на нем отображается процесс загрузки приложения. Не могу добиться нормального функционирования, потоки не помогают. Разве что действительно таймер использовать)))
×
×
  • Создать...