Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Какой функцией "подождать" пока отработает код?   Найти похожие ветки 

 
Верный вопрос   (2004-11-21 19:48) [0]

Какой функцией "подождать" пока отработает код перед тем как начнет выполняться следующий код?


 
DrPass ©   (2004-11-21 19:50) [1]

Если речь идет об многопоточном приложении - то обычно WaitForSingleObject. Если об обычном, то в орешник


 
Frozzen   (2004-11-21 19:51) [2]

Такая ситуация может возникнуть при многопоточном приложении
можно использовать критические секции, семофоры или мьютексы


 
Piter ©   (2004-11-21 20:05) [3]

без примера не обойтись...


 
GuAV ©   (2004-11-21 20:11) [4]

Верный вопрос   (21.11.04 19:48)
Какой функцией "подождать" пока отработает код

Код чего ?

потока, процесса ? - WaitForSingleObject.

Чего то ещё ? - в орешник !


 
Верный вопрос   (2004-11-21 20:15) [5]

У меня в TStringList загружается большое кол-во строк. А в ListBox загружается список навигации пл списку в TStringListе.
При кликании по элементу в ListBoxе в TStringListе происходит поиск нужной строки и переписывание данных из "сектора" (строки в TStringListе разделены на "сектора" разделителями Сектора бывают по 3-5 тыс строк) в Memo.
Так вот, если кликать по элементам ListBoxа, то все происходит прекрастно, а вот если пользователь использует для навигации кнопки Up Down то все начинает тормозить, а потом появляется сообщение - стек переполнен.
Предупреждая ответ типа : "Запретить реакцию на кнопки Up и Down" хочу сказать вот что. ListBox очень-очень долго грузит все элементы навигации потому что их слишком много, поэтому приходится держато его в другом TStringListе. А для того чтобы он не тормозил я придумал такую фишку - при загрузке я помещаю в него только 50 прервых элементов списка. Ну, короче вот :

//BaseItems - стринглист содержащий список навигации
//Label2.caption - номер элемента стоящего первым в листбоксе
//Label3.caption - номер элемента стоящего последним в листбоксе

i := strtoint(Label3.caption);

if i < 50 then exit;

if key = vk_down then
  begin
   if not (Label3.caption = inttostr(BaseItems.Count-1)) then
     begin
       ListBox1.Items.Delete(0);
       ListBox1.Items.Insert(50,BaseItems.Strings[strtoint(Label3.caption)+1]);
       Label3.caption := inttostr(strtoint(Label3.caption)+1);
       Label2.caption := inttostr(strtoint(Label2.caption)+1);
     end;
  end;

if key = vk_up then
  begin
   if not (Label2.caption = "0") then
     begin
       ListBox1.Items.Delete(ListBox1.Items.Count-1);
          ListBox1.Items.insert(0,BaseItems.Strings[strtoint(Label2.caption)-1]);
       Label3.caption := inttostr(strtoint(Label3.caption)-1);
       Label2.caption := inttostr(strtoint(Label2.caption)-1);
     end else exit;
  end;
end;


Надеюсь теперь стало хоть чуть яснее.


 
Верный вопрос   (2004-11-21 20:26) [6]

Короче я пишу для одного сайта программу содержащую солюшены (прохождения) к играм. Игр дофига, прохождения бывают более чем на 200 страниц. Все это дело храню в одном файле таким образом :

============================
список игр
---------------
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
============================

Если быстро проходится по списку навигации, то стек переполняется.


 
DesWind ©   (2004-11-21 20:27) [7]

Здесь должна хорошо подойти критическая секция модуль SyncObj если не ошибаюсь


 
Piter ©   (2004-11-21 21:42) [8]

Верный вопрос   (21.11.04 20:15) [5]

у меня только один вопрос. Нафига использовать TStringList? Почему бы не хранить информацию в TListBox?

Хотя еще интересно что за секции... чего то ты намудрил


 
DrPass ©   (2004-11-21 22:11) [9]


> ListBox очень-очень долго грузит все элементы навигации
> потому что их слишком много, поэтому приходится держато
> его в другом TStringListе

Перед тем, как грузить, вызови ListBox.Lines.BeginUpdate, после завершения - ListBox1.Lines.EndUpdate, будет намного быстрее
Что касается твоего вопроса - в однопоточном приложении не бывает ситуации, когда один код выполняется до того, как закончилась предыдущая команда. У тебя ошибка где-то в логике приложения.


 
KilkennyCat ©   (2004-11-21 22:16) [10]

так как есть

> ListBox1.Items.Count


спользование подобного:

> Label3.caption := inttostr(strtoint(Label3.caption)+1);
> Label2.caption := inttostr(strtoint(Label2.caption)+1);

некрасиво.


 
Верный вопрос   (2004-11-22 00:19) [11]

>Piter ©   (21.11.04 21:42) [8]
>у меня только один вопрос. Нафига использовать TStringList? Почему >бы не хранить информацию в TListBox?

1). Загрузи в TListBox ок. 90.000 строк.
2). Попытайся быстро по ним перемещаться, искать отсеивать и т.д.
3). Перегружай и обновляй элементы листбокса каждый раз, когда  
   происходит загрузка нового списка.

Сколько времени потребуется? Даже 1) не выполнишь. Вот для этого и СтрингЛист.

>Хотя еще интересно что за секции... чего то ты намудрил

Как ты можешь посоветовать мне хранить ок 90.000 описаний, прохождений и кодов от игр не разделяя их друг от друга в одном файле? Плюс к этому обеспечить быстрый доступ к любому из них в случае чтения, записи или перезаписи?
Поэтому приходится разделять их друг от друга метками, части между двумя метками я назвал "секциями" потому что не смог придумать название более популярно описывающее эти блоки информации.

Жду ответа.


 
Eugene1501   (2004-11-22 00:40) [12]

Мне кажется для таких задач лучше использовать базы данных.

Кроме того DrPass уже говорил:
>Что касается твоего вопроса - в однопоточном приложении не >бывает ситуации, когда один код выполняется до того, как >закончилась предыдущая команда. У тебя ошибка где-то в логике >приложения.


 
Palladin ©   (2004-11-22 00:50) [13]


> [11] Верный вопрос   (22.11.04 00:19)

Твои способности не стоят показываемой амбиции.


 
Верный вопрос   (2004-11-22 01:20) [14]

>Palladin ©   (22.11.04 00:50) [13]
>Твои способности не стоят показываемой амбиции.

О моих способностях вы ничего не знаете, а соответственно и судить не можете. Амбиции я никакой не показывал в отличии от ответов некого Piter ©. Я на вашем сайте нвсего около года, но Piter мне запомнился тем что он постоянно отвечает подобным образом - высокомерно и неуважительно. Заметьте : пост [5] объясняет что такое это "секции" а пост [6] их еще и схематически показывает. И почему использовать Листбокс не удобно там тоже объяснено.

Piter ©   (21.11.04 21:42) [8]

Верный вопрос   (21.11.04 20:15) [5]

у меня только один вопрос. Нафига использовать TStringList? Почему бы не хранить информацию в TListBox?

Хотя еще интересно что за секции... чего то ты намудрил


Ну как можно спокойно реагировать на такое?

И вообще я на этом сайте заметил такое не только у Piter а у многих, очень многих тутошных обитателей. Если сказать нечего - лучше вообще ничего не говорить чем говорить не по делу и флудить, нет, начинают угарать над тем что человек в программировании соображает мало и задает на их взгляд тупые вопросы. А сами когда только учились программировать что не разу не задавали вопросы типа "А как скопировать из одного Мемо текст в другой Мемо"

Спасибо за внимание. Досвидания.


 
Piter ©   (2004-11-22 01:38) [15]

Верный вопрос   (22.11.04 0:19) [11]
Загрузи в TListBox ок. 90.000 строк


я что, на идиота похож?

Вопросы не те задаешь. У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 ТЫСЯЧ строк куда бы то ни было. И не стоит искать компонент, который может с этим справится. Это даже с точки зрения интерфейса не юзабельно. Представляю, если мне предложать выбрать из 90.000 строк нужную мне. Я рехнусь.
Делай поиск, используй что-то типа базы данных.

Как минимум нужно разделить все игры по алфавиту, что уже снизит хотя бы раз в 20 объем информации в каждом разделе. Плюс сделай многостраничное отображение информации, как делают поисковые машины, допустим, не более 100 записей на одной странице. В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".


 
Piter ©   (2004-11-22 01:59) [16]

Верный вопрос   (22.11.04 1:20) [14]
Ну как можно спокойно реагировать на такое?


а что такого? Я спросил зачем ты используешь TStringList. А потом еще спросил что за секции.

Данными вопросами я тебя оскорбил? :)
Ты пойми, тут тоже люди не глупые. И если ты объясняешь, а люди не понимают - вполне возможно, что ты коряво объясняешь.

Спасибо за внимание. Досвидания

пока, пока :)
Пойми простую вещь - ответ на вопрос нужен ТЕБЕ. Мне и многим другим параллельно обидешься ты или нет, уйдешь с этого сайта или нет.

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

О моих способностях вы ничего не знаете, а соответственно и судить не можете

тут ты не прав. Ты же привел кусок кода. А по коду вполне даже можно судить об уровне программиста. Не точно, но приблизительно можно...


 
Мирон ©   (2004-11-22 02:16) [17]

Piter ©   (22.11.04 1:38) [15]
В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".


Гм... Так автор, вроде, и двигался в этом направлении. Хоть и через ж%@., но все-таки...


 
Германн ©   (2004-11-22 03:01) [18]

2 Верный вопрос   (21.11.04 20:15) [5]
Не вдавался в детали твоего алгоритма. Но возникли сомнения, когда ты сказал, "при загрузке я помещаю в него только 50 прервых элементов списка."
И при этом:
ListBox1.Items.Delete(0);  //Уничтожаем Item 0
ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)+1]); //Добавляем Item 50!...

то бишь - таки сколько строк у тебя 50 или 51?


 
Верный вопрос   (2004-11-22 03:03) [19]

Piter ©   (22.11.04 01:59) [16]

>У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 >ТЫСЯЧ строк куда бы то ни было.

90.000 строк на экран я не вывожу. Даже намека на это нигде не было. Я сказал что они содержатся в TStringListr а он как известно на экран не лезет.

>Представляю, если мне предложать выбрать из 90.000 строк нужную >мне. Я рехнусь.

Пользователю хотящему найти игру среди этого списка предстоит потрудится и всего навсего ввести хоть малюсенький кусок ее названия, хоть обрывок конца названия в строку поиска и опа, все названия из базы совпавшие с запрашиваемым текстом будут немедленно показаны в Листбоксе. А далее кликай по назвыанию и менее чем за треть секунды в поле "Описание" представленное Ричедитом появится текст относящийся к этой игре.

>Это даже с точки зрения интерфейса не юзабельно.

Интерфейс простой : окно разделено на две части - правую и левую. Левая более узкая чем правая потому что в ней находится листбокс с названиями игр и строка поиска. Правая сторона - ричедит в котором отображается текст по игре. Вот и весь интерфейс.

И вообще все в оффтоп ушло, блин, я кажется понял как объяснить :
Короче листбокс, в нем названия игр кликаю по любому его элементу , текст соответствующий выбраной игре появляется в поле описания.  Жму кнопку Down, фокус переходит на нижестоящий элемент, начинается заполнение текстом поля описания. Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова. После 20-30 таких переходов все виснет и появляется таблчка типа Стек переполнен. Как этого избежать? Вот.


 
Верный вопрос   (2004-11-22 03:07) [20]

>Германн ©   (22.11.04 03:01) [18]

ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)
+1]); //Добавляем Item не 50 а 51


 
Германн ©   (2004-11-22 03:17) [21]

2 Верный вопрос   (22.11.04 03:07) [20]
То бишь сначала последняя строка списка имела индекс 49. Затем удалили нулевую строку и последняя строка заимела индекс 48. И после всего этого ты вставляешь строку с индексом не 50 а 51! :(((


 
GuAV ©   (2004-11-22 03:19) [22]

Верный вопрос   (21.11.04 20:15) [5]
ListBox очень-очень долго грузит все элементы навигации потому что их слишком много, поэтому приходится держато его в другом TStringListе. А для того чтобы он не тормозил я придумал такую фишку - при загрузке я помещаю в него только 50 прервых элементов списка.


Всё это неправильно !
Надо Style := lbVirtual и обрабатывать OnData
Посмотри в демках Virtual ListView.


 
Юрий Зотов ©   (2004-11-22 03:23) [23]

> Верный вопрос   (22.11.04 03:03) [19]

Задизаблите кнопку Down на время заполнения ричэдита, вот и все проблемы. Или, если это невозможно, то флажок введите.

Метод_заполнения_ричэдита (вариант 1).
begin
 DownButton.Enabled := False;
 try
   ... // Заполняем ричэдит
 finally
   DownButton.Enabled := True
 end
end;

Метод_заполнения_ричэдита (вариант 2). // Flag - глоб. пер-ная.
begin
 if not Flag then
 begin
   Flag := True;
   try
     ... // Заполняем ричэдит
   finally
     Flag := False
   end
 end
end;


 
GuAV ©   (2004-11-22 03:33) [24]

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
 var Data: String);
begin
  Data := Format("Элемент № %d", [Index]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Style := lbVirtual;
 ListBox1.Count := 10000;
end;

Этот список лёгко обрабатывает 10000 элементов. А Virtual Listview и миллион строк потянет (через ownerdata и OnData).


 
Верный вопрос   (2004-11-22 03:53) [25]

Спасибо Всем! Похоже получается!

>Германн ©   (22.11.04 03:17) [21]
...
Вот примерный кусок кода. может что не верно, писал тут по памяти в 05:52 по нашему.


if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := u to 50 do
 begin
  ListBox1.Items.add(BaseItems.Strings[i]);
 end;
        Label2.Caption := inttostr(0);
        Label3.Caption := inttostr(50);

......

if key = vk_down then
 begin
  if not (Label3.caption = inttostr(BaseItems.Count-1)) then
    begin
      ListBox1.Items.Delete(0); /// удаляем первую      
      ///а так как строк стало 49, то последняя освободилась,  ///значит
ListBox1.Items.Insert(50,BaseItems.Strings[strtoint(Label3.caption)+1]);
///Вставляем в пустую 50 строку элемент под номером
///strtoint(Label3.caption)+1 - что значит 51

      Label3.caption := inttostr(strtoint(Label3.caption)+1);
      Label2.caption := inttostr(strtoint(Label2.caption)+1);

//После этого прибавляем к обоим индексам по 1

    end;
 end;


Все еще непонятно?


 
Германн ©   (2004-11-22 04:40) [26]

2 Верный вопрос   (22.11.04 03:53) [25]
Увы, все еще не понятно. :(

В частности не понятно:

u := 0;
for i := u to 50 do

От i:=0 до i:=50 - 51 итерация. А у тебя есть их?


 
Верный вопрос   (2004-11-22 09:34) [27]

Базара нет, опИсался, говорю же прямо тут писал, стдесб правильно будет так

if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := 0 to u do
begin
 ListBox1.Items.add(BaseItems.Strings[i]);
end;


 
Skyle ©   (2004-11-22 12:21) [28]

Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова.


Положить таймер, который перезапускается каждый раз при изменении активного элемента листбокса. А в его обработчике уже сделать отключение таймера и показ текста в RichEdit. Интервал таймера - по желанию.



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

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.035 c
14-1099726170
DillerXX
2004-11-06 10:29
2004.12.05
Не поможите ли с олимпиадной задачей?


4-1098600632
Глеб
2004-10-24 10:50
2004.12.05
Завершение программы, которая ранее была запущена


14-1100533327
grig_p
2004-11-15 18:42
2004.12.05
Посоветуйте по поводу моющего пылесоса


3-1099488058
MEV
2004-11-03 16:20
2004.12.05
abs в Firebird


14-1100750611
alienserg
2004-11-18 07:03
2004.12.05
помогите потестировать мессенджер...