2009-03-14 43 views
7

Có cách nào để chạy mã Lua từ chương trình C/C++ ở mức chi tiết hơn so với lệnh gọi hàm "lua_pcall" chuẩn không? Lý tưởng nhất là tôi muốn có thể lặp qua một danh sách các hướng dẫn bytecode mức thấp (giả sử nó có những thứ như vậy) và chạy chúng từng cái một, để tôi có thể viết bộ lập lịch của riêng mình có nhiều quyền kiểm soát hơn là chỉ chạy một hàm Lua hoàn chỉnh từ đầu đến cuối. Lý do tôi muốn làm điều này là vì tôi muốn thực hiện các chức năng C mà mã Lua có thể gọi sẽ làm cho chương trình đợi cho đến khi một hành động nhất định (có khả năng kéo dài) đã hoàn thành trước khi tiếp tục thực hiện. Sẽ có một tỷ lệ cao các lời gọi hàm như vậy trong một kịch bản Lua điển hình, vì vậy ý ​​tưởng viết lại nó để sử dụng các cuộc gọi lại khi hành động đã hoàn thành không thực sự thực tế.Trình thông dịch Lua mức độ thấp

Trả lời

14

Có lẽ phụ bước câu hỏi, nhưng bạn có thể sử dụng Lua coroutines chứ không phải là tùy chỉnh C công cụ để chờ đợi cho đến khi một số sự kiện xảy ra.

Ví dụ, một coroutine có thể gọi hàm waitForEvent(). Trong đó, bạn có thể chuyển sang một coro khác cho đến khi sự kiện đó xảy ra, sau đó tiếp tục sự kiện đầu tiên. Hãy xem the lua coro docs để biết thêm về điều đó.

+1

Giải pháp này dường như có nhiều tiềm năng - đặc biệt khi API C có thể sinh/tiếp tục coroutines. – andygeers

6

Đề xuất của Jder để sử dụng coroutines sẽ hoạt động rất tốt nếu bạn có thể viết những thói quen chờ đợi lâu dài của C bằng cách sử dụng tính năng luồng hợp tác (tính năng rõ ràng) của Lua. Bạn vẫn sẽ sử dụng lua_pcall() để vào Lua, nhưng điểm vào sẽ là hàm quản lý coroutine của bạn.

Điều này chỉ hoạt động mặc dù nếu các thói quen C không làm bất cứ điều gì trong khi họ chờ đợi. Nếu chúng chạy dài vì chúng tính toán ví dụ, thì bạn cần chạy nhiều luồng hệ điều hành. Lua là luồng an toàn - chỉ cần tạo nhiều luồng và chạy lua_open() trong mỗi luồng.

Từ http://www.lua.org/pil/24.1.html

Thư viện Lua định nghĩa không biến toàn cầu ở tất cả. Nó giữ tất cả trạng thái trong cấu trúc động lua_State và một con trỏ tới cấu trúc này được chuyển thành một đối số cho tất cả các hàm bên trong Lua. Triển khai này làm cho Lua reentrant và sẵn sàng để sử dụng trong mã đa luồng .

Bạn cũng có thể kết hợp hai phương pháp tiếp cận. Nếu bạn có một hàm Lua bao bọc để bắt đầu một chuỗi hệ điều hành, bạn có thể sinh lợi sau khi bạn bắt đầu luồng. Người quản lý coroutine sẽ theo dõi các chủ đề và tiếp tục một coroutine khi chủ đề nó bắt đầu đã kết thúc. Điều này cho phép bạn sử dụng một trình thông dịch Lua đơn lẻ với nhiều luồng công nhân chạy mã C thuần túy.

5

Nếu bạn đi theo luồng hệ điều hành, vui lòng xem Lua Lanes. Tôi sẽ thấy nó là giải pháp hoàn hảo cho những gì bạn đang cố gắng đạt được (= ném một mô-đun addon vào hỗn hợp và bạn sẽ làm cho mã rõ ràng, dễ hiểu và đơn giản với đa luồng liền mạch được xây dựng trong).

Vui lòng cho chúng tôi biết sự cố của bạn đã được giải quyết như thế nào. :)

+0

Cảm ơn bạn đã liên kết - Tôi chắc chắn sẽ xem xét điều này – andygeers

Các vấn đề liên quan