我想从HTML调用TypeScript(ultimetely JavaScript)函数.问题是我还想使用模块系统(systemjs,commonjs等)和webpack.
这是一个例子:
example.ts:
export class Example {
myFunction() {
alert('Test');
}
}
Run Code Online (Sandbox Code Playgroud)
example2.ts:
export function doSomething() {
alert('Test2');
}
Run Code Online (Sandbox Code Playgroud)
example.html的:
<html>
<head>
<script src="path/to/the/compiled/js/file.js"></script>
<script>
$(document).ready(function() {
$('#test-btn').click(function(){
var example = new Example(); //error1
example.myFunction();
});
});
</script>
</head>
<body>
<button id="test-btn">Click me</button>
<a href="javascript:doSomething()">Click me too</a> <!-- error2 -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
错误注释指示错误发生的位置:找不到导出的类/函数,因为使用了模块系统.如果我查看已编译的js文件,我可以看到类和函数声明放在某些模块函数中,因此无法从HTML访问它们.
目前我通过将整个$(document).ready...部分移动到TypeScript文件中来使用解决方法.但是对于这个<a href...例子我没有任何解决方法.
所以我的最后一个问题是:实际上是否可以从HTML调用TypeScript函数/类并使用模块系统?
我在玩,std::atomic但我认为我并不完全理解这个概念.我想知道为什么没有原子容器.所以我玩了一下.首先我尝试了以下内容:
std::atomic<std::list<int> > atomicList;
Run Code Online (Sandbox Code Playgroud)
但正如其他人已经指出的那样,这不起作用,因为构造函数是noexcept.所以我创造了一些黑客:
template<class T>
class MyList
{
public:
//Make sure that no exception is thrown
MyList() noexcept
try: l()
{}catch(...) {}
void push_back(const T &t) { l.push_back(t); }
void pop_front() { l.pop_front(); }
size_t size() const { return l.size(); }
private:
list<T> l;
};
atomic<MyList<int> > atomicList;
Run Code Online (Sandbox Code Playgroud)
现在我使用它,但我发现它无法正常工作,我得到Segmentation故障错误.
有人可以解释为什么不可能以这种方式创建原子列表?
编辑:如果有人想看看我的测试程序如何真正寻求更好的理解:
#include <list>
#include <thread>
#include <sys/time.h>
#include <iostream>
#include <atomic>
using namespace std;
template<class T>
class MyList
{
public:
MyList() noexcept
try: l() …Run Code Online (Sandbox Code Playgroud) 我知道使用以下方法将矢量"转换"为c样式数组是合法的:
std:vector<char> v;
char *c = &v[0];
Run Code Online (Sandbox Code Playgroud)
对于std :: deque来说也是如此吗?
我创建了一个从磁盘加载数据的自定义数据结构,然后数据结构类为每个加载的对象调用一个回调函数.这一切都很好 - 我只想给你一些背景信息.
实际问题在于以下功能:
void getData(std::vector<long long> &c) const
{
c.reserve(myDataStructure.size());
std::size_t index = 0;
myDataStructure.forEach([&c, &index] (const long long &data) //load data
{
c[index++] = data; //line 8
return true; //line 9
});
}
Run Code Online (Sandbox Code Playgroud)
该函数非常简单:它从我的自定义结构加载所有数据并将其保存在向量中.为了获得更好的性能,我在开始时保留内存.现在,当我在gdb中运行程序时,它多次到达第8行,但每次检查c它的内容都是空的.我是否以错误的方式使用lambda函数?顺便说一句:我正在使用g ++并启用了优化
附加信息:以下代码按预期工作,我真的没有看到区别:
void getData(std::function<bool(const MyData&)> f) const
{
myDataStructure.forEach([&f] (const long long &data)
{
MyData d(data);
//process data
return f(d);
});
}
Run Code Online (Sandbox Code Playgroud) 我不太确定它是否真的正确我想要做的事情但是没有那么多关于Vulkan的文档,所以这就是我提出的.如果我的设计方式完全错误,请纠正我!
在我的Vulkan应用程序中,我有三个不同的队列
我正在尝试实现异步模型加载,这意味着所有顶点,纹理等都在一个单独的线程中加载.模型加载完成后,主线程会更新绘图命令缓冲区,以便渲染新加载的对象.
一切正常,因为它应该期望我从Vulkan Validation层获得警告:
线程错误:VkQueue类型的对象同时用于线程...
如果我单步执行调试器,我可以看到以下行受到影响:
//main Loop
vkQueueSubmit(graphicsQueue, ...) //draw command buffer
Run Code Online (Sandbox Code Playgroud)
和
//Background loading thread
vkQueueSubmit(transferQueue, ...)//copy vertex command buffer
Run Code Online (Sandbox Code Playgroud)
我打印了地址,graphicsQueue并transferQueue发现它们是相同的(相同的地址),所以看起来我的显卡只支持单个队列.所以现在我正在尝试同步vkQueueSubmit使用信号量的调用:
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &queueSemaphore;
Run Code Online (Sandbox Code Playgroud)
不幸的是,错误仍然是一样的.
所以我的问题是:如何正确地同步呼叫vkQueueSubmit?