Похоже, что UserManager
не имеет доступных данных при его создании. Данные доступны, только если свойство is_loaded
истинно.
В GLib сигнал notify
может выдаваться при изменении свойства. Поэтому мы воспользуемся этим в следующем рабочем примере:
int main () {
var loop = new EventLoop ();
var manager = new UserManager (loop);
if (!manager.is_running) {
print ("AccountsService is not running\n");
return 1;
}
loop.run ();
return 0;
}
class UserManager {
private Act.UserManager manager;
private EventLoop loop;
public bool is_running {
get { return !manager.no_service (); }
}
public UserManager (EventLoop event_loop) {
loop = event_loop;
manager = Act.UserManager.get_default ();
manager.notify["is-loaded"].connect( this.loaded );
}
void loaded (ParamSpec property) {
print (@"Property \"$(property.name)\" has changed\n");
this.print_users ();
this.loop.quit ();
}
void print_users () {
if (!manager.is_loaded) { return; }
print ("%-20s | %-20s\n", "User name", "Logged In Time");
foreach (var user in manager.list_users ()) {
print ("%-20s | %-20s\n",
user.user_name,
new DateTime.from_unix_local(user.login_time).to_string()
);
}
}
}
class EventLoop {
private MainLoop loop;
public EventLoop () {
loop = new MainLoop ();
}
public void run() {
this.loop.run ();
}
public void quit() {
Idle.add (()=> {
this.loop.quit ();
return Source.REMOVE;
});
}
}
В примере создается класс UserManager
для оболочки UserManager AccountsService. Предполагается, что менеджер пользователей никогда не загружается, когда он впервые возвращается Act.UserManager.get_default ()
, поэтому как часть конструктора устанавливается обратный вызов при изменении свойства is_loaded
. Это строка:
manager.notify["is-loaded"].connect( this.loaded );
manager
имеет сигнал уведомления, который выдается при изменении любого свойства. В примере используется деталь сигнала, которая срабатывает только при изменении свойства is-loaded
. По какой-то причине в его имени используется тире, а не подчеркивание. Я не мог найти никакой документации о том, почему это так. С сигналом notify
обратный вызов может принимать ParamSpec
в качестве аргумента. Это использовалось для поиска сведений об изменившемся свойстве, но в примере больше не требуется, поскольку используется подробность сигнала "is-loaded"
.
В примере также создается класс EventLoop
, который действует как оболочка вокруг класса MainLoop
GLib. UserManager
имеет зависимость EventLoop
, поэтому цикл обработки событий может завершиться и программа завершится.
Другим подходом может быть использование службы org.freedesktop.Accounts
D-Bus непосредственно из Vala.
person
AlThomas
schedule
20.06.2017
GLib.Timeout
вместо узкой петли? - person Jens Mühlenhoff   schedule 20.06.2017