Some tasks to be finished

本文涵盖Windows编程核心技能的学习与实践,包括阅读《Programming Windows》理解消息路由及窗口绘制,深入研究MFC框架,实现托盘程序。此外,还涉及经典游戏如俄罗斯方块和扫雷的开发过程,强调遵循编码规范,并探讨了红蓝设计模式的实现方法。
Task listing:
1. Read 《Programming Windows》(manage message routing and windows painting)
2. Read 《Dissect MFC》(understand the framework completely)
3. Implement a Windows Tray
4. Tetris(Game)
5. Mine(Game)
6. Coding obey the Coding Spec
7. Understand Redo/Undo design pattern and implement it with source code
8. COM
9. Implement painting function like WMP
pub fn run_gpu_device(opts: Options) -> anyhow::Result<()> { let Options { x_display, params: mut gpu_parameters, resource_bridge, socket, wayland_sock, } = opts; let channels: BTreeMap<_, _> = wayland_sock.into_iter().collect(); let resource_bridge_listeners = resource_bridge .into_iter() .map(|p| { UnixSeqpacketListener::bind(&p) .map(UnlinkUnixSeqpacketListener) .with_context(|| format!("failed to bind socket at path {}", p)) }) .collect::<anyhow::Result<Vec<_>>>()?; if gpu_parameters.display_params.is_empty() { gpu_parameters .display_params .push(GpuDisplayParameters::default()); } let ex = Executor::new().context("failed to create executor")?; // We don't know the order in which other devices are going to connect to the resource bridges // so start listening for all of them on separate threads. Any devices that connect after the // gpu device starts its queues will not have its resource bridges processed. In practice this // should be fine since the devices that use the resource bridge always try to connect to the // gpu device before handling messages from the VM. let resource_bridges = Arc::new(Mutex::new(Vec::with_capacity( resource_bridge_listeners.len(), ))); for listener in resource_bridge_listeners { let resource_bridges = Arc::clone(&resource_bridges); ex.spawn_blocking(move || match listener.accept() { Ok(stream) => resource_bridges .lock() .push(Tube::new_from_unix_seqpacket(stream).unwrap()), Err(e) => { let path = listener .path() .unwrap_or_else(|_| PathBuf::from("{unknown}")); error!( "Failed to accept resource bridge connection for socket {}: {}", path.display(), e ); } }) .detach(); } // TODO(b/232344535): Read side of the tube is ignored currently. // Complete the implementation by polling `exit_evt_rdtube` and // kill the sibling VM. let (exit_evt_wrtube, _) = Tube::directional_pair().context("failed to create vm event tube")?; let (gpu_control_tube, _) = Tube::pair().context("failed to create gpu control tube")?; let mut display_backends = vec![ virtio::DisplayBackend::X(x_display), virtio::DisplayBackend::Stub, ]; if let Some(p) = channels.get("") { display_backends.insert(0, virtio::DisplayBackend::Wayland(Some(p.to_owned()))); } // These are only used when there is an input device. let event_devices = Vec::new(); let base_features = virtio::base_features(ProtectionType::Unprotected); let listener = VhostUserListener::new_socket(&socket, None)?; let gpu = Rc::new(RefCell::new(Gpu::new( exit_evt_wrtube, gpu_control_tube, Vec::new(), // resource_bridges, handled separately by us display_backends, &gpu_parameters, /* rutabaga_server_descriptor */ None, event_devices, base_features, &channels, /* gpu_cgroup_path */ None, ))); let backend = GpuBackend { ex: ex.clone(), gpu, resource_bridges, state: None, fence_state: Default::default(), queue_workers: Default::default(), platform_workers: Default::default(), shmem_mapper: Arc::new(Mutex::new(None)), }; // Run until the backend is finished. let _ = ex.run_until(listener.run_backend(backend, &ex))?; // Process any tasks from the backend's destructor. Ok(ex.run_until(async {})?) }
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值