Lua Academy · Pelajaran

Panggilan Balik: Menghantar Fungsi Lua kepada C

Gunakan ffi.cast untuk mencipta panggilan balik C yang memanggil semula kod Lua.

Pelajaran 4 daripada 413 langkah

Panggilan Balik: Menghantar Fungsi Lua kepada C ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah Callback C?

Sesetengah API C memerlukan anda menghantar penuding fungsi yang akan dipanggil semula oleh kod C. ffi.cast FFI membolehkan anda mencipta penuding fungsi yang serasi dengan C daripada fungsi Lua.

Mengisytiharkan Jenis Callback

Mula-mula, isytiharkan jenis penuding fungsi dalam cdef.

local ffi = require("ffi")
ffi.cdef[[
  typedef void (*callback_t)(int event, void *data);
  void register_handler(callback_t cb);
]]

Mencipta Callback

Gunakan ffi.cast("callback_t", luaFunc) untuk membungkus fungsi Lua sebagai callback C. Hasilnya ialah penuding fungsi C yang boleh dihantar kepada kod C.

local function myHandler(event, data)
  print("Event:", event)
end
local cb = ffi.cast("callback_t", myHandler)
lib.register_handler(cb)

Jangka Hayat Callback

Simpan rujukan Lua kepada objek callback (cb). Jika objek itu dikutip oleh GC, pemanggilan penuding fungsi C akan menyebabkan ranap. Simpannya dalam pemboleh ubah atau jadual yang berjangka hayat panjang.

local callbacks = {}  -- prevent GC
callbacks[#callbacks+1] = ffi.cast("callback_t", myHandler)
lib.register_handler(callbacks[#callbacks])

Mengisih dengan Pembanding C

Hantar pembanding Lua kepada qsort C melalui callback FFI.

ffi.cdef[[
  typedef int (*cmp_t)(const void *a, const void *b);
  void qsort(void *base, size_t nmemb, size_t size, cmp_t cmp);
]]
local arr = ffi.new("int[5]", {3,1,4,1,5})
local cmp = ffi.cast("cmp_t", function(a, b)
  return ffi.cast("int*", a)[0] - ffi.cast("int*", b)[0]
end)
ffi.C.qsort(arr, 5, ffi.sizeof("int"), cmp)
for i = 0, 4 do io.write(arr[i] .. " ") end

Callback dan Coroutine

Callback Lua yang dipanggil daripada C tidak boleh yield (memanggil coroutine.yield). Bahagian C tidak menyokong pertukaran coroutine Lua. Reka callback supaya tidak melakukan yield.

Upvalue dalam Callback

Callback Lua boleh menangkap upvalue seperti biasa. Ini membolehkan callback mengakses konteks (contohnya objek atau jadual keadaan) tanpa pemboleh ubah global.

local function makeHandler(ctx)
  return ffi.cast("callback_t", function(event, _)
    ctx.lastEvent = event  -- upvalue access
  end)
end

Pengendali Isyarat

Daftarkan fungsi Lua sebagai pengendali isyarat Unix melalui FFI. Berhati-hatilah: pengendali isyarat mempunyai sekatan ketat terhadap fungsi C yang boleh dipanggilnya.

Pengurusan Memori Callback

Bebaskan callback dengan cb:free() selepas membatalkan pendaftarannya daripada bahagian C. Kebocoran objek callback membazirkan memori.

Alternatif: Fungsi Pembungkus C

Untuk penyepaduan yang kompleks, shim C nipis mungkin lebih kemas daripada callback FFI. Shim itu memanggil semula Lua melalui API C, lalu memberikan kawalan penuh terhadap coroutine dan pengendalian ralat.

Prestasi

Callback FFI pantas tetapi tidak sepantas panggilan FFI langsung kerana jambatan C-ke-Lua melibatkan overhed persediaan. Untuk callback berfrekuensi sangat tinggi (contohnya audio), pertimbangkan pelaksanaan C tulen.

Soalan Panggilan Balik

Mengapakah Anda mesti menyimpan rujukan Lua kepada objek panggilan balik FFI?

Imbas Kembali: Panggilan Balik FFI

Gunakan ffi.cast("fn_ptr_type", luaFunc) untuk mencipta panggilan balik yang serasi dengan C. Sentiasa simpan satu rujukan untuk menghalang GC. Panggilan balik tidak boleh melakukan yield. Gunakan nilai upvalue untuk menghantar konteks kepada panggilan balik.

Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Panggilan Balik: Menghantar Fungsi Lua kepada C” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Panggilan Balik: Menghantar Fungsi Lua kepada C”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Panggilan Balik: Menghantar Fungsi Lua kepada C”?

Gunakan ffi.cast untuk mencipta panggilan balik C yang memanggil semula kod Lua. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Panggilan Balik: Menghantar Fungsi Lua kepada C” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas FFI: ffi.cdef dan ffi.load
  2. Memanggil Fungsi C melalui FFI
  3. Penuding, Struct dan Tatasusunan dalam FFI
  4. Panggilan Balik: Menghantar Fungsi Lua kepada C
← Kembali ke Lua Academy