Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
В твоем случае синхронизация не нужна. Она была бы нужна если бы переменная была длиннее четырех байт (строка или дата например), или если бы оба потока считывали и записывали в нее. А когда один только пишет, а второй только читает - все будет работать без проблем.

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 09:40 02-10-2008
Dimoniusis



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu по вложенности
 

Код:
 
Файл       Правка        Справка
Открыть    Копировать
Выход      Вставить
 

 
Menu1.Items[0].Caption =>Файл
Menu1.Items[0].Items[0].Caption => Открыть
Menu1.Items[0].Items[1].Caption => Выход
Menu1.Items[1].Caption =>Правка
Menu1.Items[1].Items[0].Caption => Копировать
Menu1.Items[1].Items[1].Caption => Вставить
Menu1.Items[2].Caption =>Справка
 
через Items.Count можно выяснить сколько подитемов есть

Всего записей: 4134 | Зарегистр. 18-10-2005 | Отправлено: 10:06 02-10-2008 | Исправлено: Dimoniusis, 10:07 02-10-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
А какой случай то?
a) Пишете экземпляр в учебник.
б) Расчитываете на VirtualPC, dotNet, и разные процессоры
  (Ну если представлять шину данных в связи с памятью, то так и будет. Всвязи с кешем процессора, я бы тут притормозил. Устанавливал win2000 на старый пентиум - ошибка установки. Отключил кэш процессора - установка прошла полностью.)
в) Филосовский вопрос, - ну по win32, так это в кибернетике макроподход, когда ты ничего не знаешь, что там внутри может находится. NT конечно защитит чужие процессы, но не гарантирует работоспособность процесса использующего "ненадёжные" техники программирования.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 11:38 02-10-2008
anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
А какой случай то?  

Я так понимаю вопрос был ко мне? Запись и чтение четырехбайтной выравненной переменной это атомарная операция на x86 процессорах и в дополнительной синхронизации не нуждается.

Цитата:
a) Пишете экземпляр в учебник.  

Рихтер уже все написал.

Цитата:
б) Расчитываете на VirtualPC, dotNet, и разные процессоры  

Я так понял речь шла про нормальную программу. а не про извращения вроде dotNet. А процессоры бывают только x86. Во всяком случае дельфийский компилятор расчитан только на них.

Цитата:
в) Филосовский вопрос, - ну по win32, так это в кибернетике макроподход, когда ты ничего не знаешь, что там внутри может находится. NT конечно защитит чужие процессы, но не гарантирует работоспособность процесса использующего "ненадёжные" техники программирования.

Это надежная техника программирования. В самом деле.

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 12:41 02-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat
 
Скажите, пожалуйста, а где можно почерпнуть такую подробную информацию: при каких размерах переменной и при каких конкрентно действиях нужна синхронизация, а при каких не нужна? Какие операции атомарные, а какие нет?
Откуда это можно узнать?
 
Добавлено:
Dimoniusis
 
А если, скажем через месяц я решу, что на первом месте в моем меню должна быть позиция "Настройки".
Я сделаю так:
Menu1.Items[0].Caption =>Настройки
И после этого мне придется заново переделывать кучу кода, так как произошло смещение нумерации на одну позицию:
Menu1.Items[1].Caption =>Файл  
Menu1.Items[1].Items[0].Caption => Открыть  
Menu1.Items[1].Items[1].Caption => Выход  
Menu1.Items[2].Caption =>Правка  
Menu1.Items[2].Items[0].Caption => Копировать  
Menu1.Items[2].Items[1].Caption => Вставить  
Menu1.Items[3].Caption =>Справка  
 

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 15:36 02-10-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat

Цитата:
Я так понял речь шла про нормальную программу. а не про извращения вроде dotNet.

А я думал IUnknown придумали люди понимающие что-то в "надёжной" технике.  
 
ps.
Уверен, что ничего не понял. Что лучше, Вам, как говориться виднее.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 16:23 02-10-2008 | Исправлено: delover, 15:54 03-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще одна проблема возникла... мне уже неудобно спрашивать...
Свернул я программу в трей,  по нажатию правой кнопкой мыши всплывает popupmenu. И вот с ним возник один неприятный глюк.  
Моя программа начинает работать по таймеру. Допустим программа в трее, я нажал правой кнопкой мыши и вижу popupmenu, в этот момент срабатывает таймер - он запускает программу и одновременно делает неактивными некоторые строки popupmenu. И вот после этого popupmenu "виснет" - нажать на активные пункты меню в нем нельзя, при повторном нажатии на значок трея правой кнопкой мыши меню вообще перестает появлятся.  
Как избавится от такого глюка...

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 17:02 02-10-2008
RSoFT1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu, как вариант можно принудительно закрывать меню при срабатывании таймера (или блокировать срабатывание таймера при открытом меню).

Всего записей: 34 | Зарегистр. 19-05-2007 | Отправлено: 19:35 02-10-2008 | Исправлено: RSoFT1978, 19:36 02-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RSoFT1978
Как программно принудительно закрыть меню?
 
Добавлено:
И еще предположение, по таймеру программа (после того, как сделала неактивными строки меню) уходит в параллельный поток, может в этом дело?

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 20:01 02-10-2008
RSoFT1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu, попробуйте popupmenu1.FreeOnRelease (если я правильно помню, сейчас не имею возможности проверить)

Всего записей: 34 | Зарегистр. 19-05-2007 | Отправлено: 22:37 02-10-2008
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu

Цитата:
И еще предположение, по таймеру программа (после того, как сделала неактивными строки меню) уходит в параллельный поток, может в этом дело?

Возможно да. А что у вас за таймер, мне кажется стандартный не должен срабатывать, пока открыта менюшка?

Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 23:57 02-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RSoFT1978
Frodo_Torbins
Не работает метод, меню не исчезает.
Таймер стандартный.
Вроде форма прорисовывается в основном потоке... может какая синхронизация хитрая нужна именно в вмомент перехода между потоками...

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 01:57 03-10-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
http://www.delphi32.com/info_facts/faq/faq_278.asp
и тут
http://forum.vingrad.ru/act-ST/f-85/t-41546.html

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:42 03-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все это у меня есть... видимо какой то специфический глюк. То есть, когда программа уже работает во втором потоке, менюшка прекрасно всплывает. А виснет она только в момент ухода в параллельный поток (при открытом menu) .
 
Вот процедура обработки мыши и popupmenu.  

Код:
 
procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
 GetCursorPos(p);  
 Case Msg.LParam OF  
  WM_LBUTTONUP,WM_LBUTTONDBLCLK:  
                   Begin
                    Ic(2,Application.Icon);  
                    ShowWindow(Application.Handle,SW_SHOW);  
                    ShowWindow(Handle,SW_SHOW);  
                   End;
  WM_RBUTTONUP:  
   Begin
    SetForegroundWindow(Handle);  
    PopupMenu1.Popup(p.X,p.Y);  
    PostMessage(Handle,WM_NULL,0,0);
   end;
 End;
end;
 

 
Вот что происходит когда срабатывает таймер:

Код:
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=false;
  EnterWorkerThread;
  try
  Dm.LoadMsg;
  finally
  LeaveWorkerThread;
  end;
  if (i_t=0) and (status= -25) then Timer1.Interval:=600000;
  Timer1.Enabled:=true;
  t:=incMillisecond(time,timer1.interval);
end;
 

 
Вот что делает процедура LoadMsg (упрощенный вариант):

Код:
 
procedure TDM.LoadMsg;
var
   mailcicl: integer;  
   partstr: integer;
   s: string;
   addr, addr2, addr3, addr4: string;  
   FN, FN1: string;
   stroka1, stroka2, stroka3, stroka4: string;
   stroka, sstroka, rv: string;
   tt, ing:integer;
   SS,ss2:char;
 
begin
  try
      POP3.Connect;  
   except
      on e:Exception do
      begin
          exit;
      end;
   end;
   tt:=POP3.CheckMessages;
   for mailcicl:=1 to tt do  
   begin
        IdMessage.Clear;  
        Main.Form1.Memo1.Clear;
        IdMessage.NoDecode:=false;
        ing:=0;
        POP3.Retrieve(mailcicl,IdMessage);
        ....... // обработка
        ....... // обработка
   end;
...
...
end;
 

А проблему все-таки как-то надо решить... очень критично..

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 09:00 03-10-2008
anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu

Цитата:
Скажите, пожалуйста, а где можно почерпнуть такую подробную информацию: при каких размерах переменной и при каких конкрентно действиях нужна синхронизация, а при каких не нужна? Какие операции атомарные, а какие нет?  
Откуда это можно узнать?  

Рихтер, глава 8 - Синхронизация потоков в пользовательском режиме.
Но твоя ситуация - практически единственная, когда синхронизация не нужна.
delover

Цитата:
А я думал IUnknown придумали люди понимающие что-то в "надёжной" технике.

Там счетчик, изменяемый из нескольких потоков - совсем другая ситуация.

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 09:17 03-10-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu

Цитата:
    PopupMenu1.Popup(p.X,p.Y);    

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

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:24 03-10-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat
А я бы и через десять годков такую тему не стал подымать. Зачем Вам это если не секрет? Таблов мало чтоли... ?)

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 13:06 03-10-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
Вот рабочий код, который я как раз использовал, чтобы меню нормально исчезало

Код:
 
 
procedure SwitchToWindow(Wnd: HWnd; Restore: Boolean);
begin
  if IsWindowEnabled(Wnd) then begin
{$IFDEF WIN32}
    SetForegroundWindow(Wnd);
    if Restore and IsWindowVisible(Wnd) then begin
      if not IsZoomed(Wnd) then
        SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
      SetFocus(Wnd);
    end;
{$ELSE}
    SwitchToThisWindow(Wnd, Restore);
{$ENDIF}
  end;
end;
 
      WM_USER + 1:
       case lParam of
          WM_RBUTTONDOWN:begin
              GetCursorPos(Cur);
              SwitchToWindow(hWnd,False);
              TrackPopupMenu(hSysMenu,TPM_RIGHTALIGN,Cur.x,Cur.y,0,hWndMain,nil);
            end;
 


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 14:34 03-10-2008
anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
А я бы и через десять годков такую тему не стал подымать. Зачем Вам это если не секрет? Таблов мало чтоли... ?)

Каких траблов? Можешь ты пальцем показать, где тут могут получиться проблемы?
Запись и чтение выравненных 4 байт выполняются одной ассемблерной инструкцией, переключиться на другой поток в середине инструкции процессор не может. Откуда может взяться трабла?

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 14:57 03-10-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ладно ... не получилось у меня избавится от бага... все равно всем спасибо..

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 15:41 03-10-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru