Page 1 of 3

DM_GETDLGITEMSHORT: operation not implemented

Posted: Mon 23 Dec, 2019 11:57
by buniak_a_h
Здравствуйте.
То ли я чего-то не понимаю то ли ошибка.
%FARHOME%\Encyclopedia\FarEncyclopedia.ru.chm wrote: Сообщение DM_GETDLGITEMSHORT посылается Менеджеру диалогов для получения информации о заданном элементе. Отличается от DM_GETDLGITEM тем, что FarDialogItem.Data, FarDialogItem.Mask и FarDialogItem.History всегда возвращаются как NULL.
В результате получаю:

Code: Select all

C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll:
...Data\Roaming\Far Manager\Profile\Macros\Bax.Test\www.lua:5: bad argument #1 to 'send' (operation not implemented)
ЧЯДНТ ???

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Mon 23 Dec, 2019 12:09
by Shmuel
buniak_a_h wrote: Mon 23 Dec, 2019 11:57 bad argument #1 to 'send' (operation not implemented)
Ровно то, что написано. DM_GETDLGITEMSHORT не реализован в LuaFAR'е (вероятно я посчитал, что можно без него обойтись).

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Mon 23 Dec, 2019 12:14
by buniak_a_h
Спасибо. Гугль-переводчик подвёл, неправильно это сообщение перевёл: "операция не выполнена" …

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 03:35
by citRiks
Shmuel,
А может быть напрасно что его нету?
На большие элементы-списки, например историю, DM_GETDLGITEM берет по 20 милисекунд,
на все остальные обычные элементы - ноль миллисекунд.
имело бы смысл получать урезанный вариант элементов без списков, если они не нужны

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 09:15
by Shmuel
citRiks wrote: Sat 02 Jan, 2021 03:35 А может быть напрасно что его нету?
Может и напрасно. Хотя у меня не было практического случая, чтобы это ощутить.

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 16:15
by citRiks
Shmuel,
на всякий случай сообщаю :)что вот у меня есть такой случай
надо читать все элементы у всех диалогов для некоего анализа,
исходные данные такие:
* незагруженный (10% нагрузки) процессор со средним CPU в 10%
Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz, 2301 Mhz, 2 Core(s), 4 Logical Processor(s)
Installed Physical Memory (RAM) 12.0 GB
* история из 30,000 записей
* код такой:

Code: Select all

local t_dlg_elm_get_1 = Far.UpTime
local dlg_elem = hDlg:send(
	"DM_GETDLGITEM",
--	"DM_GETDLGITEMSHORT",
	1)
local t_dlg_elm_get_2 = Far.UpTime
local t_dlg_elm_get = t_dlg_elm_get_2 - t_dlg_elm_get_1
if t_dlg_elm_get > 0 then
	win.OutputDebugString(string.format("time to get dialog elem: %s, %s list items", t_dlg_elm_get, #dlg_elem[6]))
end
В среднем, повторно запуская чтобы были "горячие" запуски,
получаем в среднем 80 милисекунд, что весьма ощутимо,
тем более что в историю приходится лазить очень часто..

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 16:52
by Shmuel
citRiks wrote: Sat 02 Jan, 2021 16:15 на всякий случай сообщаю :)что вот у меня есть такой случай
Из вашего примера мало что можно понять, но если каждый раз нужно получать 30000 значений элементов диалога, то скорее всего править надо алгоритм.
Данную тему более обсуждать не буду, извините.

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 17:58
by citRiks
Shmuel,
тему можно и не обсуждать, да :) и cпасибо за внимание
Но на всякий случай отмечу что, что 30,000 это не количество элементов диалога,
а количество значений в списке, которые как раз и не нужны,
но идут в нагрузку к запросу на элемент, который нужен, но без этого его списка.

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 18:39
by citRiks
Shmuel wrote: Sat 02 Jan, 2021 16:52 Из вашего примера мало что можно понять,
дополненный пример происходящего:

Code: Select all

local F = far.Flags
local G = far.Guids

local tbl_dlg_menu_hist_guid = {
	[G.HistoryCmdId]	= true,
	[G.HistoryEditViewId]	= true,
	[G.HistoryFolderId]	= true
}

Event { description = "Test DM_GETDLGITEM(SHORT) for \"historical\" menus";
	group = "DialogEvent";
	condition = function(evt, fde)
		-- we interested only in single open event:
		if	evt	~= F.DE_DLGPROCEND
		or	fde.Msg ~= F.DN_GOTFOCUS
		then	return
		end
		-- dialog info should be ready to read it:
		local	dlg_info = far.SendDlgMessage(fde.hDlg, F.DM_GETDIALOGINFO)
		if not	dlg_info
		then 	return
		end
		-- normalize binary GUID representation to readable string:
		local	dlg_guid = string.upper(win.Uuid(dlg_info.Id))
		-- GUIDs of interest only:
		return	tbl_dlg_menu_hist_guid[dlg_guid]
	end;
	action = function(evt, fde)
		-- lets put time measure base point:
		local t_dlg_elm_get_1 = Far.UpTime
		-- fetch the menu item SINGLE element:
		local dlg_elem = fde.hDlg:send(
			-- currently the only flag message to get it:
			"DM_GETDLGITEM",
			-- this was not implemented:
		--	"DM_GETDLGITEMSHORT",
			-- number of the menu list element in the dialog structure:
			1)
		local t_dlg_elm_get_2 = Far.UpTime
		-- so, the time is: (average is 80 ms on decent hosts)
		local t_dlg_elm_get = t_dlg_elm_get_2 - t_dlg_elm_get_1
		-- this is the ELEMENT list of VALUES:
		local tbl_hist_list = dlg_elem[6]
		-- put this small report here: (catch it with DbgView of SysInternals, for example)
		win.OutputDebugString(string.format("FAR: time to get dialog elem: %s, which has %s history items", t_dlg_elm_get, #tbl_hist_list))
	end;
}

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 18:46
by Shmuel
citRiks, ну допустим это нужно, так просите Фар-груп, создайте виш на трекере и т.п. и т.д.

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 19:17
by citRiks

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sat 02 Jan, 2021 20:34
by buniak_a_h
citRiks, если я правильно понял, Вы составляете список имён историй (выводите в OutputDebugString). Я бы лучше попросил расширить функционал Dlg.GetValue. Есть какая-то незавершённость: все элементы итема можно проверить, а 6-й почему-то нельзя. Чем он хуже?

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sun 03 Jan, 2021 07:02
by citRiks
buniak_a_h,
не, это просто для примера медленности обычного (не ШОРТ) ГЕТИТЕМ-а
мне надо получать элемент без списка, а список всегда придается в комплекте,
что слишком затратно для компутера и медленно для юзера,
когда прилагаемый список большой, конкретно у меня проблемы с ~10 тысячами
еще раз, речь не про 10000 элементов, а про 10000 значений в списке элемента

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sun 03 Jan, 2021 07:05
by citRiks
buniak_a_h,
про Dlg.GetValue() не понял, что у него не соответствует заявленным здесь АПИ?
https://api.farmanager.com/ru/macro/mac ... g.GetValue
не сообщает о фокусе когда должен (Type = 6) ?

"Вылет" при посылке DM_GETDLGITEMSHORT

Posted: Sun 03 Jan, 2021 08:13
by buniak_a_h
citRiks wrote: Sun 03 Jan, 2021 07:05 buniak_a_h,
про Dlg.GetValue() не понял, что у него не соответствует заявленным здесь АПИ?
https://api.farmanager.com/ru/macro/mac ... g.GetValue
не сообщает о фокусе когда должен (Type = 6) ?
1. Я ошибся, говоря про FarDialogItem.History - Вы в Вашем примере анализируете другой элемент (Param).
2. Я, вроде, не писал, что Dlg.GetValue не соответствует описанию. Просто нет значения Type, по которому можно получить FarDialogItem.History (а также FarDialogItem.Mask, FarDialogItem.MaxLength и FarDialogItem.UserData). Причём при Type=7 для CheckBox и RadioButton фактически возвращается FarDialogItem.Selected (ну, т.е. FarDialogItem[6]), и даже для ListBox-а и ComboBox-а возвращается некий результат анализа 6-го элемента FarDialogItem (текущая позиция - элемент FarDialogItem[6].SelectIndex). А вот сам 6-й элемент (например, если это - массив FarList) - не получить. А хотелось бы именно здесь иметь доступ к любому элементу FarDialogItem-а