A customer had a custom message loop that was built out of MsgWaitForMultipleObjects. Occasionally, they needed to change the list of handles that the message loop was waiting for. How do you add or remove a handle from an active MsgWaitForMultipleObjects?
You can’t.
Even if you could, it meant that the return value of MsgWaitForMultipleObjects would not be useful. Suppose it returns to say “Handle number 2 was signaled.” You don’t know whether handle 2 was signaled before the handle list was updated, or whether it was signaled after. You don’t know whether it’s referring to the handle number 2 or the new one.
So maybe it’s not a bad thing that you can’t change the list of handles in an active MsgWaitForMultipleObjects, since the result wouldn’t be useful. But you can ask the thread to stop waiting, update its handle list, and then go back to waiting.
Since the thread is in a MsgWaitForMultipleObjects, it will wake if you send a message to a window that belongs to the thread. You can have a “handle management window” to receive these messages, say
The background thread could send one of these messages if it wanted to add or remove a handle, and the message procedure would perform the corresponding operation.
In reality, you probably need more information than just the handle; you also need to know what to do if that handle is signaled. The lParam is more likely to be a pointer to a structure containing the handle as well as instructions on what the handle means. Those instructions could take the form of a callback function, or it could just be a value from an enum. Pick the design that works for you.
Next time, we’ll look at the case where you don’t want to block the background thread, or if the waiting thread is waiting in WaitForMultipleObjects so the message option is not available.
This is part 5 of a 6-part series we’re running about how product managers are using AI tools and vibe coding. Written by and for product managers.
Summary
Product managers spend as much time launching a feature as building it, across disconnected tools.
Every tool switch adds hidden costs: reformatting time, mismatched design tokens, lost context, and delayed alignment.
Replit Agent 4 generates stakeholder decks, live dashboards, and animations directly from your existing project.
Running an AI model as a one-shot script is useful, but it forces you to restart the model every time you need a result. Setting it up as a service lets any application send requests to it continuously, without reloading the model. This guide shows how to serve Reka Edge using vLLM and an open-source plugin, then connect a web app to it for image description and object detection.
You need a machine with a GPU and either Linux, macOS, or Windows (with WSL). I use UV, a fast Python package and project manager, or pip + venv if you prefer.
Clone the vLLM Reka Plugin
Reka models require a dedicated plugin to run under vLLM, not all models need this extra step, but Reka's architecture requires it. Clone the plugin repository and enter the directory:
git clone https://github.com/reka-ai/vllm-reka
cd vllm-reka
The repository contains the plugin code and a serve.sh script you will use to start the service.
Download the Reka Edge Model
Before starting the service, you need the model weights locally. Install the Hugging Face Hub CLI and use it to pull the reka-edge-2603 model into your project directory:
This is a large model, so make sure you have enough disk space and a stable connection.
Start the Service
Once the model is downloaded, start the vLLM service using the serve.sh script included in the plugin:
uv run bash serve.sh ./models/reka-edge-2603
The script accepts environment variables to configure which model to load and how much GPU memory to allocate. If your GPU cannot fit the model at default settings, open serve.sh and adjust the variables at the top. The repository README lists the available options. The service takes a few seconds to load the model weights, then starts listening for HTTP requests.
As an example with an NVIDIA GeForce RTX 5070, here are the settings I used to run the model:
With the backend running, time to start the Media Library app. Clone the repository, jump into the directory, and run it with Docker:
git clone https://github.com/fboucher/media-library
cd media-library
docker compose up --build -d
Open http://localhost:8080 in your browser, then add a new connection with these settings:
Name: local (or any label you want)
IP address: your machine's local network IP (e.g. 192.168.x.x)
API key: leave blank or enter anything — no key is required for a local connection
Model: reka-edge-2603
Click Test to confirm the connection, then save it.
Try It: Image Description and Object Detection
Select an image in the app and choose your local connection, then click Fill with AI. The app sends the image to your vLLM service, and the model returns a natural language description. You can watch the request hit your backend in the terminal where the service is running.
Reka Edge also supports object detection. Type a prompt asking the model to locate a specific feature (ex: "face") and the model returns bounding-box coordinates. The app renders these as red boxes overlaid on the image. This works for any region you can describe in a prompt.
Switch to the Reka Cloud API
If your local GPU is too slow for production use, you can point the app at the Reka APIs instead. Add a new connection in the app and set the base URL to the Reka API endpoint. Get your API key from platform.reka.ai. OpenRouter is another option if you prefer a unified API across providers.
The model name stays the same (reka-edge-2603), so switching between local and cloud is just a matter of selecting a different connection in the app. The cloud API is noticeably faster because Reka's servers are more powerful than a local GPU (at least mine :) ). During development, use the local service to avoid burning credits; switch to the API for speed when you need it.
What You Can Build
The service you just set up accepts any image, or video via HTTP — point a script at a folder and you have a batch pipeline for descriptions, tags, or bounding boxes. Swap the prompt and you change what it extracts. The workflow is the same whether you are running locally or through the API.
Hi Insiders,
It’s Marcus. I lead Design and Research across Windows & Devices, everything from Windows and Windows Cloud to user experience research, and the industrial design behind Surface and Xbox.
What I love most about this role is the end‑to‑end perspective it gives me. I get to see Windows as a complete experience, from the software and shell to the hardware, and ultimately to how it shows up in your lives and how it makes you feel.
That’s exactly why I was excited to take on an expanded role with the Windows Insider Program: to listen more closely, engage more directly, and continue improving Windows for over 1 billion people.
Throughout my career, the best products have come from a real connection with the community where both sides want to build something we're proud of. That’s the relationship we want with our Insider community.
Over the past few months, I’ve had the chance to meet with many of you to hear firsthand how we can improve the Windows Insider Program. We’ve taken that feedback seriously, and there’s a lot already underway. I’m excited about giving you more of a voice with more access to the people building Windows.
[caption id="attachment_178853" align="alignnone" width="1024"] A photo taken during our Seattle Insiders meetup[/caption]
Last month, we took our first step by hosting an Insider meetup in Seattle. It was an opportunity to connect the community directly with members of the Windows product team, get hands‑on with new experiences, share what’s working well, and be candid about what we can do better.
Now, we’re taking that experience on the road, bringing it to five more cities over the next few months. At each stop, I’ll be there alongside members of the Insider team and our Windows product makers, sharing where the Windows Insider Program is headed and, just as importantly, listening to how we can keep making it better for you.
Our first stops include New York, Hyderabad, Taipei, San Francisco, and London, with more to come.
April 21 – New York City (USA)
May 7 – Hyderabad (India)
May 13 – Taipei (Taiwan)
June 4 – San Francisco (USA)
June 23 – London (UK)
If you’re interested in connecting and getting a preview of some of the work happening across the commitments Pavan shared last month, I’d love for you to come say hello.
You can register your interest today here.
We are taking action on your feedback to improve the Insider Program, from clearer channels to more control over the features you care about, and more. We are excited to share more details about these changes later this week.
I hope to meet many more of you in the coming months at our various events. Keep the feedback coming.
— Marcus